1

私は正規表現のルックアラウンドを練習しています。そのために、SQL挿入ステートメントからテーブル名を抽出しようとしています。正規表現が(?<=INSERT INTO )\w+(?= (\(|VALUES).+)あり、Stringでテストしてい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))

2番目のものはから来ました

Pattern.matches(regex, searchString)

split引数との一致で文字列を分割するのではありませんか?これは、正規表現が一致したtestsため、結果が一致したことを意味し[INSERT INTO , VALUES (regex, test)]ます。では、なぜPattern.matchesfalseを返したのでしょうか。私が逃したものはありますか?

4

2 に答える 2

4

次を使用した場合に同じ問題が発生する場合は、試してみます。

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

m.find()そして、 trueを返すかどうかを確認します

Pattern.matches文字列全体が一致することを期待します。これらは幅がゼロのアサーションであり、一致した文字は破棄されるため、ルックアラウンドに問題がある可能性があります。

于 2012-04-28T19:40:31.613 に答える
1

ジョアンナの答えに少し追加すると、先読みと後読みは試合に参加しません。Pattern.matches文字列の先頭から最後まで正規表現が一致する必要があります。肯定的な後読み ( INSERT INTO) があるため、一致textは最初ではない場所から始まります。同様に、最後の先読みは、最後にも一致がないことを意味します。

split最初から一致を開始する必要がないため、期待どおりに機能します。

于 2012-04-28T19:47:07.580 に答える