テスト データ:
たとえば、上記の単純なログ エントリでは、2 つの目標を達成する必要があります:
1. 8 番のデータをフィルターで除外します;
2. robots.txt 文字列を含まないエントリを見つけます (URL に robots.txt が含まれている限り、すべてがフィルターで除外されます) )。
先読み構文は次のとおりです。
(?!匹配模式)
まず、最初の目標、つまり特定の文字列で始まらないエントリを照合することを達成しましょう。
ここでは連続文字列を除外する必要があるため、一致パターンは非常に単純で、2009-07-08 です。実装は次のとおりです。
^(?!2009-07-08).*?$
Expresso を使用すると、結果が実際に 8 番のデータを除外していることがわかります。
次に、2 番目の目標、つまり特定の文字列を含むエントリを除外することを達成しましょう。
上で書いた方法に従って、私はそれを調べてみました:
^.*?(?!robots\.txt).*?$
この規則の規則を現地語で説明すると、次のようになります: 先頭に任意の文字があり、その後に続くことはありませんrobots.txt の連続した文字列。その後に任意の数の文字が続き、文字列の終わりが続きます。
テストを実行すると、
が期待した効果が得られなかったことがわかりました。どうしてこれなの?デバッグするために、上記の正規表現に 2 つのキャプチャ グループを追加しましょう:
^(.*?)(?!robots\.txt)(.*?)$
テスト結果:
これがわかります。まず、最初のグループです。は何も一致しませんでしたが、2 番目のグループは文字列全体と一致しました。先ほどの正規表現に戻って分析してみましょう。
実際、通常のエンジンは領域 A を解析するときに、領域 B の先読み作業をすでに開始しています。このとき、領域 A が Null - .* 本来は null 文字との一致を許可されており、先読み条件が満たされている場合に一致が成功したことがわかり、領域 A の直後にロボットではなく文字列 "2009" が続きました。したがって、照合プロセス全体ですべてのエントリが正常に照合されます。
理由を分析した後、次のように上記の正規表現を修正し、.*? を先読み式に移動しました。 :
推奨チュートリアル:
Java 開発入門#
以上がJava は正規表現を使用して、特定のルールを含まない文字列と一致します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。