2016-11-15 14 views
5

現在、正規表現に関する本を扱っています。練習問題の1つは、正規表現を書くことです。 aの数はzと同じであり、bの数はyの数と同じです。これまでに次の正規表現を思いついた。これに正規表現は、zと同じ量のaとyの値とが一致する正規表現

^(?=[^az]*([az][^az]*[az][^az]*)*$)(?=[^by]*([by][^by]*[by][^by]*)*$).*$ 

問題だとZのもであり、Bさんとyのも(即ちazzzが一致し、より多くのZ者のよりを有するであろう)されている場合、それは間違って一致していることです。正規表現が正しく一致するように修正する方法はありますか、間違った方法を追求していますか?

+2

あなたのテストにはどのツール/言語を使用しますか? 'A'と' Z'は常に '' AAAZZZ''を注文するのですか、 '' AZZAAZA''を混ぜることができますか?これは本当に正規表現を使用するタスクのようには聞こえません。 –

+0

私は[RegEx101](https://regex101.com/r/voyrhI/1)をテストするために以下を使用しています。 AとZ、BとYはすべて本の例ごとに混在することができます。 – WBilger

+1

本は再帰式をカバーしていますか? – shawnt00

答えて

1

一部の正規表現エンジンでは、構文がエンジンごとに異なり、標準化されていませんが、あらかじめ定義されたsubroutinesを(不明瞭)define context-free grammarsに使用できます。 (不完全な、しかし、そこに取得し、まだ)守っ:これは何

(?(DEFINE) 
    (?'all'(?&az)|(?&by)|(?&abzy)|(?&bayz)) 
    (?'az'a(?&all)*z|z(?&all)*a) 
    (?'by'b(?&all)*y|y(?&all)*b) 
    (?'abzy' 
     a(?&all)*b(?&all)*z(?&all)*y| 
     a(?&all)*y(?&all)*z(?&all)*b| 
     z(?&all)*b(?&all)*a(?&all)*y| 
     z(?&all)*y(?&all)*a(?&all)*b 
    ) 
    (?'bayz' 
     b(?&all)*a(?&all)*y(?&all)*z| 
     b(?&all)*z(?&all)*y(?&all)*a| 
     y(?&all)*a(?&all)*b(?&all)*z| 
     y(?&all)*z(?&all)*b(?&all)*a 
    ) 
) 

^(?&all)+$ 

Demo on Regex101

は、サブパターンのセットを定義し、再帰的にそれらを適用します。実際の "パターン"にアンカーを^とで使用すると、文字列全体が一致することが確認されます。シンプルさ自体

実際にこのようなことを実稼働環境で実行すると、見つけたときに誰かが撃たれることになります。

+0

あなたの 'abzy'という名前のグループには' b'または 'y'で始まるバリエーションがないので、' bzya'は現時点では動作していません。また、 'abbzyy'はatmで動作していません。 –

+0

@SebastianProskeマップ関数を各行に適用して、出力を行番号の別のファイルに吐き出すことはできませんか?アインシュタインの「相対性理論」を無視する正規表現を書くよりも簡単ではないでしょうか? – MYGz

+1

@MohammadYusufGhazi:私は主に、答えの真の試みではなく、知的チャレンジのためにそれをやっています。私はこれが狂っていることを知っています。それが楽しいものです:P –

関連する問題