8

テキスト "*ALL" (大文字と小文字を区別しない)またはaz、AZ、および 0-9 の範囲内の文字 (17 文字でなければならない) のいずれかを許可する正規表現を作成する必要がありました。これは問題なく実行できました:

^([\*][Aa][Ll][Ll]|[a-zA-Z0-9]{17})$

私が抱えている問題は、同じ文字が何度も入力された場合 (例: 17 x) を取得するように変更する方法です。

4

4 に答える 4

10

これを行うには、キャッチ括弧を使用する必要があります。これは、括弧で囲まれたものは何でも正規表現パーサーのメモリに取り込まれるという概念です。

したがって、次の式があるとします。

(\w)\1+

単一の単語 character: [a-zA-Z0-9_]とその後の同じ文字に一致します。括弧は、その中に格納されているものをキャッチして記憶したためです。

だからあなたの場合:

^((?:\*[aA][lL]{2})|([a-zA-Z0-9])\1{17})$

(?:) は非キャプチャ括弧です。

\1{1,17}文字を 1 ~ 17 回繰り返す必要があることを意味する構文を使用することもできます。

別の注意として、ここで正規表現を使用するのは少しやり過ぎだと思います。おそらく文字列を保存し、小文字にしてから「*all」と比較する必要があります。等しくない場合は、正規表現^([a-zA-Z0-9])\1{17}$を使用して読みやすくすることができます。

于 2012-09-04T07:39:37.700 に答える
4

実装言語でサポートされている場合は、後方参照を使用できます

試す([a-zA-Z0-9])\1{16}

以前に一致した\1グループを指します()

于 2012-09-04T07:30:44.297 に答える
2

正規表現:

非キャプチャ:

^(?:[\*][Aa][Ll][Ll]|([a-zA-Z0-9])\1{16})$

正規表現の 2 番目の部分である は([a-zA-Z0-9])\1{16}、英数字に一致し、同じことをさらに 16 回繰り返します。

キャプチャ:

全体をキャプチャする場合は、削除して?:(つまり、このグループをキャプチャしないことを意味します)、次のように変更\1\2ます。

^([\*][Aa][Ll][Ll]|([a-zA-Z0-9])\2{16})$

一致:

*ALL
*all
all
aaaaaaaaaaaaaaaaa # 17 times same character

一致しません:

all
ALL
aaaaaaaaaaaaaaaa    # 16 times same character
aaaaaaaaaaaaaaaaaa  # 18 times same character
ababababababababa   # 17 times different characters
于 2012-09-04T07:59:28.183 に答える
0

これを試してみてください-

*[Aa][Ll][Ll]|([a-zA-Z0-9])\1{16}
于 2012-09-04T07:36:21.853 に答える