ファイルを 1 行ずつ処理していますが、逆一致を実行したいと考えています。たとえば、6 文字の文字列がある行を一致させたいのですが、これらの 6 文字が ' Andrea ' でない場合に限られます。どうすればいいですか?
RegexBuddyを使用していますが、まだ問題があります。
ファイルを 1 行ずつ処理していますが、逆一致を実行したいと考えています。たとえば、6 文字の文字列がある行を一致させたいのですが、これらの 6 文字が ' Andrea ' でない場合に限られます。どうすればいいですか?
RegexBuddyを使用していますが、まだ問題があります。
(?!Andrea).{6}
正規表現エンジンが否定先読みをサポートしていると仮定すると...
[A-Za-z]{6}
...または、代わりに使用することをお勧めします.{6}
通常、先読みと後読みは、正規表現の一致を「反転」する正しい方法ではないことに注意してください。正規表現は、実際には否定的なマッチングを行うようには設定されていません。それらは、あなたがそれらを使用している言語に任せます。
Python/Java の場合、
^(.(?!(some text)))*$
http://www.lisnichenko.com/articles/javapython-inverse-regex.html
PCREおよび同様のバリアントでは、値を含まない任意の行に一致する正規表現を実際に作成できます。
^(?:(?!Andrea).)*$
これは、tempered greedy トークンと呼ばれます。欠点は、うまく機能しないことです。
正規表現の実装の機能と構文が重要です。
先読みを使用できます。例として Python を使用すると、
import re
not_andrea = re.compile('(?!Andrea)\w{6}', re.IGNORECASE)
それを分解するには:
(?!Andrea)は、「次の 6 文字が "Andrea" でない場合に一致する」という意味です。もしそうなら
\wは「単語文字」、つまり英数字を意味します。これは、クラス [a-zA-Z0-9_] と同等です。
\w{6}は正確に 6 単語の文字を意味します。
re.IGNORECASEは、"Andrea"、"andrea"、"ANDREA" ... を除外することを意味します。
もう 1 つの方法は、プログラム ロジックを使用することです。Andrea に一致しないすべての行を使用し、それらを 2 番目の正規表現に通して 6 文字をチェックします。または、最初に少なくとも 6 つの単語文字を確認してから、それがAndreaと一致しないことを確認します。
(?!Andrea)
これは厳密には逆一致ではありませんが、正規表現で直接実行できる最善の方法です。ただし、すべてのプラットフォームがそれらをサポートしているわけではありません。
RegexBuddy でこれを行う場合、正規表現に一致しないすべての行のリストを取得する方法が 2 つあります。
テスト パネルのツールバーで、テスト スコープを「行ごと」に設定します。これを行うと、アイテム List All Lines without Matches が同じツールバーの List All ボタンの下に表示されます。([List All] ボタンが表示されない場合は、メイン ツールバーの [Match] ボタンをクリックします)。
GREP パネルで、「行ベース」チェックボックスと「結果を反転」チェックボックスをオンにして、grep しているファイル内の一致しない行のリストを取得できます。
(?!
実践に役立ちます。厳密に言えば、先読みは数学的に定義された正規表現ではありません。
逆正規表現を手動で記述できます。
これは、結果を自動的に計算するプログラムです。その結果は機械で生成され、通常は手書きよりもはるかに複雑です。しかし、結果は機能します。
Perl では次のことができます。
process($line) if ($line =~ !/Andrea/);