34

すべての文字が一意である場合にのみ単語に一致する正規表現を探しています。つまり、単語内のすべての文字が1回だけ表示されます。


abcdefg-> MATCHを返します-> NO MATCH
abcdefgbhを返します(文字が複数回繰り返されるため)b

4

3 に答える 3

57

これを試してみてください、それはうまくいくかもしれません、

^(?:([A-Za-z])(?!.*\1))*$

説明

Assert position at the beginning of a line (at beginning of the string or after a line break character) «^»
Match the regular expression below «(?:([A-Z])(?!.*\1))*»
   Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
   Match the regular expression below and capture its match into backreference number 1 «([A-Z])»
      Match a single character in the range between “A” and “Z” «[A-Z]»
   Assert that it is impossible to match the regex below starting at this position (negative lookahead) «(?!.*\1)»
      Match any single character that is not a line break character «.*»
         Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
      Match the same text as most recently matched by capturing group number 1 «\1»
Assert position at the end of a line (at the end of the string or before a line break character) «$»
于 2012-10-13T06:22:07.850 に答える
12

文字列に文字のインスタンスが2つあるかどうかを確認できます。

^.*(.).*\1.*$

(私は単にキャラクターの1つをキャプチャし、バックリファレンスを使用して他の場所にコピーがあるかどうかを確認します。残りは.*気にしません)。

上記の正規表現が一致する場合、文字列には繰り返し文字があります。上記の正規表現が一致しない場合は、すべての文字が一意です。

上記の正規表現の良いところは、正規表現エンジンが見回しをサポートしていない場合です。

どうやらJohnWooのソリューションは、一意性を直接チェックするための美しい方法です。すべての文字で、前方の文字列に現在の文字が含まれないことを表明します。

于 2012-10-13T06:14:33.127 に答える
3

これはまた、繰り返されない文字を含む任意の長さの単語に完全に一致します。

^(?!.*(.).*\1)[a-z]+$

これを取得するために、@Bohemianから提供された回答を少し前に別の質問に修正しました。

上記の質問が出てからしばらく経ちますが、この正規表現パターンもここにあるといいと思いました。

于 2017-10-26T21:56:55.373 に答える