2016-05-20 9 views
0

パターンに一定の回数一致する正規表現を作成しようとしています。 3または5 [a-z]{3,5}[a-z] 3、4または5回一致しますが、私は4正規表現 - 不連続な繰り返しの範囲

を望んでいない私は([a-z]{3})([a-z]{2})?ような何かを行うことができます知っているが、それは例のために、私はパターンに一致する場所という意味します3,5,7,13、または29倍である場合、得られる正規表現は特に厄介である。

これを行うにはもっと良い方法はありますか?

(私は例として、[-Z]を使用し、それが何かすることができる)

+1

'[a-z] {3}(?:[a-z] {2})? 'の方法が最適です。 regexの唯一の代替案は '[a-z] {5} | [a-z] {3}'などです。他の正規表現はありません。 –

+0

@WiktorStribiżew - これはこの特定の例では機能しますが、OPでも特定の繰り返し数(3,5,7,13,29回の繰り返しなど)について尋ねられたら –

答えて

3

正規表現は、任意の「一致正確にX、Y、またはZの時間」をサポートしていません。
つまり、([a-z]{29}|[a-z]{3}|[a-z]{3})のように、一致数をオプションとしてリストすることができます。しかし、あなたのパターンがちょうど[a-z]より複雑であれば、物事が乱れることがあります。

より実用的な解決策は、パターンが一致する回数を数え、それが受け入れ可能な繰り返しのリストに含まれている場合は結果を保持することです。擬似コードでは、次のようになります。

acceptable_match_counts = [1, 3, 5, 7, 19, 32, 99]; 
num_matches = regex(/([a-z]){min,max}/, my_data); 

if (num_matches in acceptable_match_counts) { 
    keep_match 
} else { 
    reject_match 
} 

ただし、これは純正の正規表現ではありません。

関連する問題