2017-04-13 38 views
0

我想在perl中使用二进制OR运算符从文件中获取一些信息。我用这个正则表达式为什么这个OR运算符不在perl中工作

/(fix|issue)\s*#/mi 

但它没有找到任何匹配。在文件中有 有4个匹配的'fix#'和3个匹配的'issue#',并且我在没有OR操作符的情况下单独使用它们时得到了正确的结果。

/fix\s*#/mi 

    /issue\s*#/mi 

所以OR假设返回7个匹配,但它什么也没有返回。

这两条线是完全相同的文件中

Add test for the example in issue #142. 

Fix #1190 

我这样做对吗?

感谢您的帮助

+1

这不是二进制OR,它是一个正则表达式中的OR。没有看到您的真实意见,我们不知道您的模式是否有效。没有'/ g',除非有零,否则你永远不会得到多于一次的比赛。 – simbabque

+0

输入是超过1000行的大文件。该文件具有完全“问题#”和“修复#”。 – Hukh

+0

文件的大小对我们无关紧要。您可以包含您认为应该匹配的一行,以及不应包含的一行。更好的是,编辑你的问题,并包括你编写的完整程序。正如下面的choroba指出的那样,这应该起作用。所以这个bug可能在我们看不到的代码中。 – simbabque

回答

3

它适合我。由于没有给出/g,因此每行匹配一次。另外,/m是无用的,因为既不使用^也不使用$/i也使ISSUE #一致。

#!/usr/bin/perl 
use warnings; 
use strict; 
use feature qw{ say }; 

while (<DATA>) { 
    say "Matched $1" if /(fix|issue)\s*#/mi; 
} 

__DATA__ 
fix # 
fix # fix # 
--- 
issue # 
issue # issue # 

注意,“二进制或”正则表达式外使用不同的运营商:

say 4 | 8; # 12 

在正则表达式|被称为“交替”。

+0

对不起,我混在他们之间,我的意思是正则表达式中的OR。谢谢你的帮助。 – Hukh

+2

@Hukh:你已经接受了一个基本上说你原来的代码应该有效的答案。如果你要解释为什么你的代码不起作用,那么对将来有类似问题的人可能会有所帮助。 –