【问题标题】:Regex: String.split and Pattern.matches does not agree with each other正则表达式:String.split 和 Pattern.matches 彼此不一致
【发布时间】:2012-04-29 03:47:07
【问题描述】:

我正在练习我的正则表达式外观,为此,我试图从 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?我错过了什么?

【问题讨论】:

  • Pattern.matches 不是用来匹配整个字符串的吗?在您的情况下,环顾四周并不是真正的“匹配”,而是测试。

标签: java regex


【解决方案1】:

如果你遇到同样的问题,我会尝试:

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

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

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

【讨论】:

  • 感谢您的回答,但我发现艾伦的信息量更大。 (--,)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-04-09
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2012-08-19
    • 2014-12-03
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多