如何使用/跳过不需要的匹配项?
假设我们有以下文本:
my $t ='good good *bad !bad -bad "alwaysbad alwaysbad alwaysbad" good';
我想要一个只匹配good
单词的正则表达式。符号词good
,bad
和alwaysbad
is 的真正内容当然是[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
附录:
感谢Borodins 的回答,我现在看得更清楚了。只需删除|
(或)并应用任何or-zero-times
量词,它就会起作用:
my $r = qr/
(?: " [^"]+ ")? \s? # skip quotes + space if any
(?<!\S) \b ([\w@]+) # find words without 'bad' prefix and capture
/x;