我正在练习我的正则表达式,为此,我正在尝试从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?我错过了什么?
答案 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
按预期工作,因为它不需要匹配从头开始。