【发布时间】:2014-03-22 21:25:23
【问题描述】:
我正在编写一个简化的 SQL 解析器,它使用正则表达式来匹配每个有效命令。我坚持匹配以下内容:
attribute1 type1, attribute2 type2, attribute3 type3, ...
其中属性是表列的名称,类型可以是 CHAR(size)、INT 或 DEC。这在 CREATE TABLE 语句中使用:
CREATE TABLE student (id INT, name CHAR(20), gpa DEC);
为了调试它,我正在尝试匹配这个:
id INT, name CHAR(20), gpa DEC
用这个:
(?<attributepair>[A-Za-z0-9_]+ (INT|(CHAR\([0-9]{1,3}\))|DEC))(, \k<attributepair>)*
我什至没有命名反向引用就试过了:
([A-Za-z0-9_]+ (INT|(CHAR\([0-9]{1,3}\))|DEC))(, \1)*
我用 regexpal 测试了后一个 regex 表达式并且它匹配,但是当我在我的 Java 程序中尝试它时两者都没有。有什么我想念的吗?我怎样才能使这项工作?也许这与我调用 Pattern.compile() 的方式有关,就像我是否缺少标志一样。我也有 JDK v7。
更新: 我发现虽然matches() 返回false,但是lookingAt() 和find() 返回true。它匹配每个单独的属性。我想制作我的正则表达式,使其匹配整个表达式而不是每个属性。
【问题讨论】:
标签: java sql regex parsing backreference