不要な一致を消費/スキップする方法は?
次のテキストがあるとします。
my $t ='good good *bad !bad -bad "alwaysbad alwaysbad alwaysbad" good';
good
単語のみに一致する単一の正規表現が必要です。もちろん、記号語good
、bad
、およびの実際の内容は(この質問では問題ありません) です。単語と単語を区別するには、単語の先頭のようなもので十分です。プレフィックスがなくても、二重引用符で囲まれたものは常に悪い言葉です。alwaysbad
[0-9A-Za-z_@]+
\w+
bad
good
(\s|^)\b\w
これは私が持っているものです:
my $r = qr/
(?: " [^"]+ " ) # skip quoted part altogether, don't capture
| # OR
(?<!\S) \b ([\w@]+) # find words without 'bad' prefix and capture
/x;
この式は引用部分をキャプチャしませんが、それでも一致します。したがって、undefined
一致リストには空のエントリがあります。
my @matches = $t =~ /$r/g;
print join "\n", @matches;
good
good
<== (uninitialized value, this comes from the quoted part)
good
今質問:
文字列の特定の部分を消費するが、それを単一の正規表現呼び出しと一致させない方法を現代のperl正規表現に適用できる手法を知っている人はいますか?
したがって、結果は次のようになります。
good
good
good
補遺:
ボロディンの回答のおかげで、よりはっきりと見えるようになりました。(or) を削除して量指定子|
を適用するだけor-zero-times
で機能します。
my $r = qr/
(?: " [^"]+ ")? \s? # skip quotes + space if any
(?<!\S) \b ([\w@]+) # find words without 'bad' prefix and capture
/x;