正则表达式:String.split和Pattern.matches彼此不一致

时间:2012-04-28 19:22:57

标签: java regex

我正在练习我的正则表达式,为此,我正在尝试从SQL插入语句中提取表名。我有正则表达式(?<=INSERT INTO )\w+(?= (\(|VALUES).+),我正在字符串INSERT INTO tests VALUES (regex, test)上测试它。虽然我知道我的正则表达式没有得到细致的完成,但我希望它与我输入的tests子字符串相匹配。

我正在使用Java的正则表达式引擎,我打印出正则表达式String.split和正则表达式Pattern.matches时的结果。我得到以下看似矛盾的结果

regex> (?<=INSERT INTO )\w+(?= (\(|VALUES).+)
string> INSERT INTO tests VALUES (regex, test)
[INSERT INTO ,  VALUES (regex, test)]
regex> (?<=INSERT INTO )\w+(?= (\(|VALUES).+)
string> INSERT INTO tests VALUES (regex, test)
false

现在只是为了记录,产生第一个结果的代码是

Arrays.toString(searchString.split(regex))

而第二个来自

Pattern.matches(regex, searchString)

是不是split将匹配的字符串拆分为其参数?这意味着正则表达式匹配tests因此结果为[INSERT INTO , VALUES (regex, test)]。那么,为什么Pattern.matches返回false?我错过了什么?

2 个答案:

答案 0 :(得分:4)

如果您使用相同的问题,我会尝试:

Pattern p = Pattern.compile(yourRegex);
Matcher m = p.matcher(inputString); 

并检查m.find()是否返回true

Pattern.matches期望整个字符串匹配 - 它可能与lookarounds有问题,因为这些是零宽度断言,因此匹配的字符将被丢弃。

答案 1 :(得分:1)

只是为Joanna的回答添加一点:Lookaheads和lookbehinds不参加比赛。 Pattern.matches要求正则表达式匹配从字符串开头一直到结尾。由于您有一个积极的后视(INSERT INTO),因此匹配从text开始,而不是在开头。同样,末尾的前瞻意味着最后也没有匹配。

split按预期工作,因为它不需要匹配从头开始。