0

文字が続く場合とない場合があり、「s」がある場合とない場合がある「エラー」の任意のバリアントに一致させたいです(全体的に大文字と小文字を区別しないと仮定します)。

たとえば、次の場合、一致する行を返します。

text error: more text
text error more text
text errors more text
text errors( more text
text errors: more text
text errors:more text

しかし、すぐ後に等号がある場合は、行を返したくありません。例えば:

text errors= more text

基本的に、「エラー」または「エラー」の後に「=」記号がある場合は、常に「エラー」です。

私はこれ以上のものを思いつくことができません:

(?i)errors?[^\=]

大文字と小文字を区別しない、文字 e、r、r、o、r、および場合によっては s で、その後に「=」が続かないのが、私が読む方法です。

1 sample text, more text, errors=123456 more text more text
2 drops=0 link status good errors=0 adapter
3 Error: process failed to start
4 process [ERROR] failed
5 this line might have both ERROR and error=5555 and more text
6 there might be a line that has error=0x02343329 ERROR and more text

1行目や2行目ではなく、3行目、4行目、5行目、6行目を返してほしい。

成功していない。事前に助けてくれてありがとう。

4

7 に答える 7

1

非常に多くの回答がありますので、すべて閉じてください。あなたが欲しいのはこれです:/error(?!s=)/im

インライン グループを使用する必要はありません。代わりに /i フラグを使用してください。

私はあなたの質問を誤解したかもしれません、よくわかりません。ただし、許可しない場合は、代わりにerror=blah使用してください。/error(?!s?=)/im

デモ+説明: http://regex101.com/r/oE1eQ9

于 2013-01-12T01:32:17.193 に答える
1

そのため、「=」または「s=」が続いていない限り、「エラー」に一致させたいと考えています。それは非常に簡単です:

/error(?!=|s=)/

次のように書くこともできます

/error(?!s?=)/

可能であれば(設定${^MATCH}などのために)本当に「エラー」に一致させたい場合は、

/error(?![s=])|errors(?!=)/

[^=]// が" " に一致するため、問題が発生していますs

于 2013-01-12T04:24:06.140 に答える
0

先読みアサーションを使用してみてください。

(?i)errors?(?!\=)
于 2013-01-12T00:55:25.750 に答える
0

試す:

(?i)\berror(?!s?=)

オプションの等号errorが後に続かない限り、ワードアンカーとそれに続く。s

(?!...)はネガティブな先読みであり、テキストを消費しないという意味でアンカー(andのような)でもあります(これはゼロ幅のアサーションです)^$

于 2013-01-12T01:29:45.530 に答える
0

論理和はどうですか?

(?i)error[^s=]|errors[^=]
于 2013-01-12T00:58:29.900 に答える
0

まあ。多くの人が正規表現を知っていると思っています!

あなた自身の正規表現(?i)errors?[^\=](誰かが言ったように、=エスケープは必要ありませんが、害[^\=]はありません)では、「等号が続かない」ことを意味するのではなく、「等号ではない文字が続く」ことを意味します"。errorが文字列の末尾にない限り、この 2 つは同じであるため、 'error' =~ (?i)errors?[^\=]false を返します。

「等号が続かない」には否定的な先読みが必要なため、一見したところ、 が必要なように見えます(?i)errors?(?!=)が、正規表現エンジンが見つかった場合は、errors=バックトラックしてオプションなしでマッチングを試みs、パターン全体を取得できるかどうかを確認しますの後に等号errorsがないため、成功します。error

これを修正するには(?>...)、一致が見つかったらバックトラックを許可しない、バックトラックなしの構造が必要です。正規表現(?i)(?>errors?)(?!=)は必要なことを行います。

最後に、「直後」に等号を拒否できるようにするため、errorまたは等号のerrors前にオプションの空白が必要な場合は、(?i)(?>errors?)(?!\s*=).

このプログラムは

use strict;
use warnings;

while (<DATA>) {
  chomp;
  printf "%-70s %s\n", $_, /(?i)(?>errors?)(?!\s*=)/ ? 'YES' : 'NO';
}

__DATA__
text error: more text
text error more text
text errors more text
text errors( more text
text errors: more text
text errors:more text
text errors= more tex
text errors = more tex
text error= more tex
text error = more tex
1 sample text, more text, errors=123456 more text more text
2 drops=0 link status good errors=0 adapter
3 Error: process failed to start
4 process [ERROR] failed
5 this line might have both ERROR and error=5555 and more text
6 there might be a line that has error=0x02343329 ERROR and more text

出力

text error: more text                                                  YES
text error more text                                                   YES
text errors more text                                                  YES
text errors( more text                                                 YES
text errors: more text                                                 YES
text errors:more text                                                  YES
text errors= more tex                                                  NO
text errors = more tex                                                 NO
text error= more tex                                                   NO
text error = more tex                                                  NO
1 sample text, more text, errors=123456 more text more text            NO
2 drops=0 link status good errors=0 adapter                            NO
3 Error: process failed to start                                       YES
4 process [ERROR] failed                                               YES
5 this line might have both ERROR and error=5555 and more text         YES
6 there might be a line that has error=0x02343329 ERROR and more text  YES
于 2013-01-12T03:06:50.327 に答える
-1

ゼロ幅の先読みは良い答えです。試す:

 (?i)(?!errors?=)error

ここで、" (?!errors?=)" は、"errors?=" と一致しないことを確認するために先読みすることを意味します。

更新: これは、質問の元の正規表現の問題を説明するためのもの(?i)errors?[^\=]です: 複雑なのは、「貪欲」(man perlre) がどのように、そしていつ、引用するほど貪欲ではないかということです:

デフォルトでは、数量化されたサブパターンは「貪欲」です。つまり、(特定の開始位置が与えられた場合) 可能な限り多くの回数一致しますが、パターンの残りの部分は引き続き一致します。

文の 2 番目の部分に注意してください。元の表現(?i)errors?[^\=]は、"errors=" (または "errors") に一致します。"[^=]" が "s" に一致するように、0 回の一致が許可されます。これが、番号が付けられた 6 行に一致する理由です。

このような一致 (*、+、? など) が拒否されたときに正規表現エンジン内で何が起こっているかは、「バックトラッキング」と呼ばれ、一致がバックアップされ、正規表現全体とのより良い一致が可能かどうかを確認するために別のパスが試行されます。独立部分式 (?>)、ルックアラウンド (?=) (?!) およびそれらの否定形は、バックトラッキングを防止または制限することができます。代替を使用することもできます。これまでのところ、「所有格」の ?+ 形式を使用して元の正規表現に最小限のバックトラッキングなしの変更を加えた人はいないようです:

errors?+[^\=]
于 2013-01-12T01:25:23.790 に答える