你写的正则表达式有多复杂?
正则表达式的功能是非常强大的,但是要使用好也是不容易的,为了能够解析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*
可以解析的SQL例子:
SELECT DISTINCT OBJECT(al) FROM AppLibraryConfig al, IN(al.apps) a WHERE a.id=?1 AND al.test=true AND al.flag=true and al.deleteTime is not null ORDER BY al.id desc
一个是只支持简单类型的:
SELECT\s+(DISTINCT)?\s*OBJECT\s*\(\s*(\w+)\s*\)\s+FROM\s+(\w+)(?:\s+AS)?\s+\2\s*
(?:WHERE\s+((?:(AND|OR)?\s*(\2)((?:\.\w+)+)\s*(=|is|<>|>=|>|<|<=)\s*(NOT)?\s*(\??\d+|null|true|false|empty)\s*)*))?
(?:\s*ORDER\s+BY\s+(\2)((?:\.\w+)+)(?:\s*(asc|desc)?))?\s*
可以解析的SQL例子:
SELECT OBJECT(crc) from CrystalReportConfig as crc where crc.name=?1 and crc.test=true and crc.deleteTime is not null order by crc.reportName
要解析出表达式中的内容还需要另外一条表达式来辅助解析WHERE部分的不定个数的条件:
(AND|OR)?\s*\s*(\w+)((?:\.\w+)+)\s*(=|is|<>|>=|>|<|<=)\s*(NOT)?\s*(\??\d+|null|true|false|empty)\s*
作者: Cherami
原载: 你写的正则表达式有多复杂?
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
日志评价
相关日志
随机日志
添加到网摘
[del.icio.us] [新浪 VIVI] [365key] [YouNote] [博采中心] [Poco] [SOHU狐摘] [天极网摘] [和讯网摘]喜欢这个插件?

该日志共有 2 条评论
发表评论 | RSS订阅 | 反向链接