解惑

解己之惑,解人之惑

标签:正则表达式

你写的正则表达式有多复杂?

正则表达式的功能是非常强大的,但是要使用好也是不容易的,为了能够解析Entity Bean的Finder中的SQL,我写了可以解析部分SQL的表达式:
一个是可以支持FROM子句中的IN语法的:
SELECT\s+(DISTINCT)?\s*OBJECT\s*\(\s*(\w+)\s*\)\s+FROM\s+(\w+)(?:\s+AS)?\s+\2\s*,\s*IN\s*\(\s*\2\.(\w+)\s*\)\s*(?:\s+AS)?\s*(\w+)\s+
(?:WHERE\s+((?:(AND|OR)?\s*(\2|\5)((?:\.\w+)+)\s*(=|is|<>|>=|>|<|<=)\s*(NOT)?\s*(\??\d+|null|true|false|empty)\s*)*))?
(?:\s*ORDER\s+BY\s+(\2|\5)((?:\.\w+)+)(?:\s*(asc|desc)?))?\s*
阅读全文

Java正则表达式的性能问题

在编写EJB-QL的解析器的时候偶然发现的。
假设要解析的EJB-QL的值为:
SELECT OBJECT(al) FROM AppLibraryConfig al WHERE al.id=?1 AND al.status=true

下面看看不同的表达式Pattern所需要的执行时间,解析的伪代码为:
long start=System.currentTimeMillis();
Pattern pattern = Pattern.compile(getPatternText(), Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(query);
if (matcher.matches()) {
        int groupCount = matcher.groupCount();
        for (int i = 0; i <= groupCount; i++)
        {
            System.out.println("Group " + i + " :[" + matcher.group(i) + "]");
        }
}
System.out.println(System.currentTimeMillis()-start);

现在看看不同的getPatternText()的值得到的不同结果。
阅读全文

© 2024 解惑

本主题由Anders Noren提供向上 ↑