おそらくまだ私が見ていないPEBKACですが、(?:[^']+|'')+
は二重引用符で囲まれていない文字列(Regex: Match double single quote inside stringに基づいており、Regex 101でテスト済み)と一致する必要があります。Java Regexバグ(一重引用符付き)
1は、Javaのパターンオブジェクト内の上記を使用していますつまり、Pattern noSingleQuote = Pattern.compile("(?:[^']+|'')+");
場合は、次のようしかし、その後、動作は次のとおりです。
- マッチした文字列は、単一引用符が含まれていない場合は、すべてのものは、マッチャーリターンOKです真(すなわち、
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:無限ループではありませんが、文字列自体のスペース数に比例するようです。私が遭遇したプロダクションコードのために、スペースがたくさんある非常に長いStringがあります。私はそれを無限ループと仮定しました。 Mea culpa。
'' 'charsをエスケープしようとしましたか? –
@ I.G.Pascualなぜですか? – f1sh
.. Javaは '' 'を特殊文字として扱い、エスケープする必要があります –