我对正则表达式有一个奇怪的问题..我想过滤掉由“大写字母”组成的“引用”文本部分。它似乎在正则表达式测试程序RegexPal中正常工作,但它在我的Perl代码中不起作用。我必须过滤掉的文字如下:
<option value="NASDAQ">NASDAQ Stock Exchange</option>
<option value="NYMEX">New York Merchantile Exchange</option>
<option selected="selected" value="NYSE">New York Stock Exchange</option>
<option value="NZX">New Zealand Exchange</option>
我使用以下正则表达式:
$line =~ m/"([A-Z]*)"/
我希望与之匹敌:纳斯达克,纽约商业交易所,纽约证券交易所和新西兰证券交易所。然而在实践中,纽约证券交易所并未因某种原因被过滤掉......
任何人都可以帮我解决这个问题吗?
更新 不幸的是,上述问题是我的错。我没有注意到我的代码中有一个额外的过滤器,它只过滤掉包含“选项值”模式的字符串。因此,由于“NYSE”字符串包含“选项选择”模式 - 它被丢弃了。我将代码更改为“选项”过滤,现在按预期工作。
答案 0 :(得分:4)
提供的正则表达式按预期工作,它将匹配:
"
"
如果NYSE
不匹配,您的代码还有其他问题。我假设您在每一行上拆分输入,然后执行上面提到的正则表达式。
以下应该是等效的:
my $haystack =<<EOT;
<option value="NASDAQ">NASDAQ Stock Exchange</option>
<option value="NYMEX">New York Merchantile Exchange</option>
<option selected="selected" value="NYSE">New York Stock Exchange</option>
<option value="NZX">New Zealand Exchange</option>
EOT
for my $line (split "\n", $haystack) {
print $line =~ m/"([A-Z]*)"/;
print "\n";
}
输出
NASDAQ
NYMEX
NYSE
NZX
如果没有正则表达式标记/g
,匹配运算符将仅返回第一个匹配。因此,如果您的行包含多个匹配表达式的子字符串,则只返回第一个。
见下面的例子:
my $haystack = "hello WORLD and STACKOVERFLOW";
print join (':', $haystack =~ m/([A-Z]+)/ ), "\n";
print join (':', $haystack =~ m/([A-Z]+)/g), "\n";
输出
WORLD
WORLD:STACKOVERFLOW
答案 1 :(得分:0)
看起来你只想要值,而不是选中的值。这将消除纽约证券交易所的进入。
$line =~ m/value="([A-Z]*)"/
答案 2 :(得分:0)
我的perl版本(5.8.9)正常工作。也许你像比尔说的那样匹配value =“”,或者用m /.../ g来扫描整条线。