2017-04-13 64 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:你已經接受了一個基本上說你原來的代碼應該有效的答案。如果你要解釋爲什麼你的代碼不起作用,那麼對將來有類似問題的人可能會有所幫助。 –