2012-04-28 20 views
1

私は正規表現のルックアラウンドを練習しています。そうするために、SQL挿入ステートメントからテーブル名を抽出しようとしています。私は正規表現(?<=INSERT INTO)\w+(?= (\(|VALUES).+)を持っており、それは文字列INSERT INTO tests VALUES (regex, test)でテストしています。私の正規表現は細心の注意を払っていないことに気付いていますが、私の入力の部分文字列testsと一致すると思います。Regex:String.splitとPattern.matchesが一致しません

私は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 

、以下を得る秒1は

Pattern.matches(regex, searchString) 
から来ている間、最初の結果を生成したコードが

Arrays.toString(searchString.split(regex)) 

です

splitは、一致する文字列をその引数に分割していませんか?つまり、正規表現はtestsと一致し、結果は[INSERT INTO , VALUES (regex, test)]となります。だから、なぜPattern.matchesが偽を返したのですか?何か私が逃した?

+0

'Pattern.matches'は文字列全体の一致に使用されていませんか?あなたのケースでは、ルックアラウンドは実際には「マッチング」ではなく、テストしています。 –

答えて

1

ジョアンナの答えにちょっと追加するだけです。ルックアヘッドとルックビハインドは試合に参加しません。 Pattern.matchesでは、文字列の先頭から末尾まで正規表現のマッチを開始する必要があります。あなたは肯定的なlookbehind(INSERT INTO)を持っているので、試合はtextから始まります。これは最初ではありません。同様に、最後の先読みは、最後にも一致がないことを意味します。

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

4

あなたが使用している場合は、同じ問題を取得する場合、私はしようとするだろう:

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

をして

Pattern.matchesm.find()リターンは文字列全体が一致することを期待かどうかを確認 - それは前後参照に問題がある可能性がありますこれらはゼロ幅のアサーションであり、一致した文字は破棄されるためです。

+0

答えに感謝しますが、私はalanがより有益であることを発見しました。 ( - 、) – skytreader