繁体   English   中英

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

[英]Regex: String.split and Pattern.matches does not agree with each other

我正在练习我的正则表达式查找方法,为此,我试图从SQL插入语句中提取表名。 我有正则表达式(?<=INSERT INTO )\\w+(?= (\\(|VALUES).+)并且正在String INSERT INTO tests VALUES (regex, test) 。我的regex并非精心制作,我希望它与我输入的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? 我错过了什么吗?

如果您使用以下方法,如果出现相同问题,我会尝试:

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

并检查m.find()返回true

Pattern.matches期望整个字符串都匹配-环顾四周可能会出现问题,因为它们是零宽度的断言,因此匹配的字符将被丢弃。

只是为了补充一下乔安娜的答案:前行和后备不参加比赛。 Pattern.matches要求正则表达式匹配从字符串的开头一直到结尾。 由于您具有向后看的正面( INSERT INTO ),因此匹配从text开头而不是开头开始。 同样,末尾的先行意味着末尾也没有匹配项。

split可以按预期工作,因为它不需要比赛从头开始。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM