2017-04-13 26 views
0

ファイルから情報を取得するために、perlで2項演算子を使用しようとしています。私はこの正規表現 このOR演算子がperlで動作しない理由

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

を使用しますが、任意の一致を見つけることができません。ファイル内の には、「修正#」と4つの一致があり、「問題番号」の3つの一致があります。

/fix\s*#/mi 

    /issue\s*#/mi 

したがって、ORは7つの一致を返すと仮定しますが、何も返しません。

これらの2行は

Add test for the example in issue #142. 

Fix #1190 

ファイルに正確にいる私はそれが正しいでしょうか?

ありがとうございます。

+1

バイナリORではなく、正規表現ではORです。あなたの実際の入力を見ることなく、あなたのパターンがうまくいくかどうかは分かりません。 '/ g'がなければ、ゼロがなければ複数の一致を得ることはありません。 – simbabque

+0

入力は1000行以上の大きなファイルです。ファイルは正確に "issue#"と "fix#"を持っています。 – Hukh

+0

ファイルのサイズは本当に私たちにとって重要ではありません。一致するはずの行と一致しない行を含めることができます。さらに、あなたの質問を編集し、あなたが書いた完全なプログラムを含めるようにしてください。以下のチョロバが指摘するように、これはうまくいくはずです。だから、バグはおそらく私たちが見ていないコードにあります。 – simbabque

答えて

3

私のために働きます。 /gが指定されていないため、1行に1回一致します。また、/mは、^でも$も使用されないので役に立たない。 /iISSUE #にも一致します。 「バイナリまたは」正規表現の外で使用される異なる演算子であること

#!/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:基本的に元のコードが機能しているはずの答えを受け入れました。あなたのコードがなぜ機能しなかったのかを説明するのであれば、将来的に同様の問題を抱える人にとっては役立つかもしれません。 –

関連する問題