まあ。多くの人が正規表現を知っていると思っています!
あなた自身の正規表現(?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