2017-01-26 19 views
0

スレッドのタイトルは少し誤解を招くかもしれませんが、名前を付けるより良い方法を見つけられませんでした。正規表現を使って、文字xとyのみを含む単語を探す方法を見つけたいと思いますが、xは偶数回使用し、yは奇数回使用しなければなりません。正規表現、偶数/奇数番号の文字を使用

答えて

1

私は2つの正規表現でそれを行う方法を知っています。

この1つのチェックもXの数(少なくとも2つ)がある場合:

/^(y*xy*x)+y*$/ 

そしてこれチェック奇数Yの数(少なくとも一つ)がある場合:

/^(x*yx*y)*x*yx*$/ 

両方は、xとyの排他的な文字列と一致します。

+0

+ 1 2つの正規表現を1つにまとめることができることに注意してください(私の答えのコメントのバージョンを参照)。 – ridgerunner

0

私は私のエディタでこれをテストしてみた:あなたが行文字の、終わりを始めて、スペースを追加することもできますので、

(?=([^x]*x[^x]*x[^x]*)*)(?=([^y]*y[^y]*y[^y]*)*[^y]*y[^y]*) 

これは、部分文字列を見つけます:

[^\s](?=([^x]*x[^x]*x[^x]*)*)(?=([^y]*y[^y]*y[^y]*)*[^y]*y[^y]*)[$\s] 

それを破るために[^x]*x[^x]*x[^x]*は最初のxが見つかるまでnot-xをつかみ、2番目のxが見つかるまでそれ以外のものをつかみます。これは()*で囲まれているので、xのすべてのペアが見つかるように無制限に繰り返します。奇数xが残っている場合(奇数xの場合)、正規表現はその単一のxを左にマッチさせることはできません。 同様に、yの場合、yのすべてのペアと一致し、次にyが1つ残っていて、それにすべてyがないことが確認されます。 私は?=を使用して一致させますがキャプチャしないので、同じ文字列でxのyをチェックできます。

0

あなたの要件を満たす1つの正規表現を実装したJavaScriptのテスト済み関数です。私は、ゼロが許容できる(均等な)数のXであると仮定しています。正規表現は複数の並んだコメントで文書化されています。

function has_even_X_odd_Y_word(text) { 
/*#!(?#!js\/i re_even_x_odd_y Rev:20170125_2100) 
    # Match word having even count of X and odd count of Y. 
    \b  # Anchor to start of word. 
    # First assert odd, non-zero count of Ys in this word. 
    (?=  # Assert odd count of Y. 
     (?: # Zero or more or more Y pairs. 
     x*y # Optional Xs preceeding 1st Y. 
     x*y # Optional Xs preceeding 2nd Y. 
    )*  # End zero or more Y pairs. 
     x*yx* # Optional Xs around last (odd) Y. 
     \b  # Anchor to end of word. 
    )  # End assert odd count of Y. 
    # Match even number of Xs (can be zero = even). 
    (?:  # Zero or more X pairs. 
     y*x # Optional Ys preceeding 1st X. 
     y*x # Optional Ys preceeding 2nd X. 
    )*  # End zero or more X pairs. 
    y*  # Optional Ys after last (even) X. 
    \b  # Anchor to end of word. 
!#*/ 
    var re_even_x_odd_y = /\b(?=(?:x*yx*y)*x*yx*\b)(?:y*xy*x)*y*\b/i; 
    if (re_even_x_odd_y.test(text)) { return true; } 
    return false; 
} // End has_even_X_odd_Y_word(). 

この関数は、渡されたテキストに一致する単語がある場合はtrueを返し、そうでない場合はfalseを返します。

関連する問題