在Perl中无法匹配带有正则表达式的模式

时间:2012-01-01 17:41:11

标签: regex perl

我对正则表达式有一个奇怪的问题..我想过滤掉由“大写字母”组成的“引用”文本部分。它似乎在正则表达式测试程序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”字符串包含“选项选择”模式 - 它被丢弃了。我将代码更改为“选项”过滤,现在按预期工作。

3 个答案:

答案 0 :(得分:4)

提供的正则表达式按预期工作,它将匹配:

  1. "
  2. 开头的子字符串
  3. 继续使用大写字符零次或多次
  4. "
  5. 结尾

    如果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来扫描整条线。