12

私はルビーで次の問題を実装しています。

これが私が欲しいパターンです:

1234、1324、1432、1423、2341など

つまり、4桁の数字の数字は[1-4]の間にあり、繰り返しがない必要があります。

簡単に理解できるように、私は2桁のパターンを取り、解決策は次のようになります:12、21

つまり、数字は1または2のいずれかであり、繰り返しではない必要があります。

繰り返しがないことを確認するために、2桁目の条件に$ 1を使用したいのですが、機能していません。

よろしくお願いします。

4

4 に答える 4

24

これを使用できます(rubular.comを参照):

^(?=[1-4]{4}$)(?!.*(.).*\1).*$

最初のアサーションはそれがであることを保証し^[1-4]{4}$、2番目のアサーションはあなたが一致できないことを保証する否定的な先読み.*(.).*\1、すなわち繰り返される文字です。最初のアサーションは「安い」ので、最初にそれを実行します。

参考文献

関連する質問

于 2010-06-23T12:04:53.173 に答える
12

ちょっとした笑いのために、ここに別のオプションがあります:

^(?:1()|2()|3()|4()){4}\1\2\3\4$

それぞれの一意の文字が消費されると、それに続くキャプチャグループは空の文字列をキャプチャします。後方参照も空の文字列と一致しようとするため、そのうちの1つが成功しなかった場合は、関連付けられたグループが一致に参加しなかったことを意味するだけです。そして、それは文字列に少なくとも1つの重複が含まれている場合にのみ発生します。

空のキャプチャグループと後方参照のこの動作は、正規表現フレーバーでは公式にサポートされていないため、emptorに注意してください。しかし、Rubyを含むほとんどの製品で機能します。

于 2010-06-23T13:49:35.957 に答える
7

この解決策は少し簡単だと思います

^(?:([1-4])(?!.*\1)){4}$

Rubularでここを参照してください

^                  # matches the start of the string
    (?:            # open a non capturing group 
        ([1-4])    # The characters that are allowed the found char is captured in group 1
        (?!.*\1)   # That character is matched only if it does not occur once more
    ){4}           # Defines the amount of characters
$

(?!.*\1)文字が繰り返されないようにするための先読みアサーションです。

^$は、文字列の開始と終了に一致するアンカーです。

于 2013-01-25T07:00:46.240 に答える
0

前の回答は問題を解決しますが、それらは可能な限り一般的ではなく、最初の文字列での繰り返しを許可していません。たとえば、{a,a,b,b,c,c}Perl Monksについて同様の質問をした後、Eilyによって次の解決策が提供されました。

^(?:(?!\1)a()|(?!\2)a()|(?!\3)b()|(?!\4)b()|(?!\5)c()|(?!\6)c()){6}$

同様に、これは文字列内のより長い「記号」、および可変長の記号に対しても機能します。

于 2018-11-22T11:15:35.490 に答える