137

ファイルを 1 行ずつ処理していますが、逆一致を実行したいと考えています。たとえば、6 文字の文字列がある行を一致させたいのですが、これらの 6 文字が ' Andrea ' でない場合に限られます。どうすればいいですか?

RegexBuddyを使用していますが、まだ問題があります。

4

9 に答える 9

87
(?!Andrea).{6}

正規表現エンジンが否定先読みをサポートしていると仮定すると...

[A-Za-z]{6}...または、代わりに使用することをお勧めします.{6}

通常、先読みと後読みは、正規表現の一致を「反転」する正しい方法ではないことに注意してください。正規表現は、実際には否定的なマッチングを行うようには設定されていません。それらは、あなたがそれらを使用している言語に任せます。

于 2008-10-02T20:28:46.700 に答える
56

Python/Java の場合、

^(.(?!(some text)))*$

http://www.lisnichenko.com/articles/javapython-inverse-regex.html

于 2009-12-15T19:57:06.583 に答える
33

PCREおよび同様のバリアントでは、値を含まない任意の行に一致する正規表現を実際に作成できます。

^(?:(?!Andrea).)*$

これは、tempered greedy トークンと呼ばれます。欠点は、うまく機能しないことです。

于 2016-08-09T09:06:59.817 に答える
11

正規表現の実装の機能と構文が重要です。

先読みを使用できます。例として 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と一致しないことを確認します。

于 2008-10-02T20:41:10.820 に答える
8

否定先読みアサーション

(?!Andrea)

これは厳密には逆一致ではありませんが、正規表現で直接実行できる最善の方法です。ただし、すべてのプラットフォームがそれらをサポートしているわけではありません。

于 2008-10-02T20:32:44.867 に答える
6

RegexBuddy でこれを行う場合、正規表現に一致しないすべての行のリストを取得する方法が 2 つあります。

テスト パネルのツールバーで、テスト スコープを「行ごと」に設定します。これを行うと、アイテム List All Lines without Matches が同じツールバーの List All ボタンの下に表示されます。([List All] ボタンが表示されない場合は、メイン ツールバーの [Match] ボタンをクリックします)。

GREP パネルで、「行ベース」チェックボックスと「結果を反転」チェックボックスをオンにして、grep しているファイル内の一致しない行のリストを取得できます。

于 2008-12-31T07:44:06.117 に答える
5

(?!実践に役立ちます。厳密に言えば、先読みは数学的に定義された正規表現ではありません。

逆正規表現を手動で記述できます。

これは、結果を自動的に計算するプログラムです。その結果は機械で生成され、通常は手書きよりもはるかに複雑です。しかし、結果は機能します。

于 2014-11-28T16:12:28.467 に答える
-4

Perl では次のことができます。

process($line) if ($line =~ !/Andrea/);
于 2008-10-02T20:56:07.010 に答える