【发布时间】:2017-01-03 10:29:43
【问题描述】:
可能是一个我还没有看到的 PEBKAC,但是:(?:[^']+|'')+ 应该匹配带有非双引号的字符串(基于 Regex: Match double single quote inside string 并使用 Regex 101 进行测试)。
但是,如果在 Java Pattern 对象中使用上述内容,即Pattern noSingleQuote = Pattern.compile("(?:[^']+|'')+");,则行为如下:
- 如果匹配的String不包含单引号,一切OK,Matcher返回true(即
noSingleQuote.matcher("tester").matches()和noSingleQuote.matcher("tes''ter").matches()都OK) - 如果匹配的字符串确实包含单引号,则 JDK
Matcher会在内部发生无限循环(即,noSingleQuote.matcher("tes'ter").matches()会导致无限循环)
在 8u112 本地测试,在线使用Regex Planet
我还没有深入调试过无限循环发生的确切原因和位置。
有什么想法、见解?
更新:给定的示例不会重现所描述的行为,使用 "select x, y, z where x = ''t'';" 和 "select x, y, z where x = 't'';" 重现了我上面描述的内容。
这对我来说意味着错误(?)不仅仅是因为单引号。
Update2:它不是一个无限循环,但它似乎与字符串本身的空格数成正比。由于我遇到的生产代码有一个很长的字符串和很多空格,我只是假设它是一个无限循环。过失。
【问题讨论】:
-
你试过转义
'chars吗? -
@I.G.Pascual 为什么?
-
.. 可能 Java 将
'视为特殊字符,需要转义 -
@I.G.Pascual 我看不出转义单引号会有什么不同,但我测试了它:用 \\ 或 \\\\ 转义所有单引号并没有什么不同(在输入字符串也不在模式中,也不在两者中)。
-
刚刚在本地尝试了相同的代码 jdk1.8.0_66 并且运行良好......看起来你的 jdk 搞砸了......