3

入力文字列を検証する単一のパターンを作成しようとしています。検証ルールでは、文字を3回以上続けて繰り返すことはできません。

例えば:

Aabcddee-有効です。

Aabcddde-3 d文字のため、無効です

目標は、上記の例の1つに一致する可能性があるが、両方には一致しない正規表現パターンを提供することです。のような後方参照を使用できることは知っています([a-z])\1{1,2}が、これは連続した文字にのみ一致します。私の問題は、そのための単一のパターンを作成する方法がわからないことです。私はこれを試しましたが、なぜそれが機能しないのかよくわかりません:

^(([a-z])\1{1,2})+$

ここでは、内部グループで1回または2回繰り返される文字を一致させようとします。次に、複数回繰り返される場合は、その内部グループを一致させます。しかし、それはそのようには機能していません。

ありがとう。

4

2 に答える 2

6

文字列に文字(改行も含む)が3回以上連続して繰り返されていないことを確認するには、次のようにします。

/^(?!.*(.)\1{2})/s

入力文字列がこの正規表現に一致しないことを確認することもできます。この場合、キャラクターが3回以上連続して繰り返されていることもわかります。ネガティブルックアヘッド内の正規表現が削除されていることを除いて、これは上記とまったく同じであることに注意してください(?!pattern)

/^.*(.)\1{2}/s

文字列にからの文字のみが含まれているという検証を追加する必要があり、無効である[a-z]と見なす場合は、次のようにします。aaA

/^(?!.*(.)\1{2})[a-z]+$/i

ご覧のとおり、iフラグ(大文字と小文字を区別しない)は、キャプチャされたテキストが現在の入力と比較される方法に影響します。

空の文字列の通過を許可する場合は、に変更+*ます。

有効であると見なしaaA、大文字と小文字の両方を許可する場合:

/^(?!.*(.)\1{2})[A-Za-z]+$/

一見、前のものと同じように見えるかもしれませんが、iフラグがないため、キャプチャされたテキストは大文字と小文字を区別しないマッチングの対象にはなりません。

以下は失敗した答えです、あなたはそれを無視することができます、しかしあなたは楽しみのためにそれを読むことができます。


この正規表現を使用して、文字列に3つの繰り返し文字(改行であっても)が含まれていないことを確認できます。

/^(?!.*(.)(?:.*\1){2})/s

入力文字列がこの正規表現に一致しないことを確認することもできます。この場合、キャラクターが3回以上繰り返されていることもわかります。ネガティブルックアヘッド内の正規表現が削除されていることを除いて、これは上記とまったく同じであることに注意してください(?!pattern)

/^.*(.)(?:.*\1){2}/s

文字列にからの文字のみが含まれているという検証を追加する必要があり、無効である[a-z]と見なす場合は、次のようにします。aaA

/^(?!.*(.)(?:.*\1){2})[a-z]+$/i

ご覧のとおり、iフラグ(大文字と小文字を区別しない)は、キャプチャされたテキストが現在の入力と比較される方法に影響します。

有効であると見なしaaA、大文字と小文字の両方を許可する場合:

/^(?!.*(.)(?:.*\1){2})[A-Za-z]+$/

一見、前のものと同じように見えるかもしれませんが、iフラグがないため、キャプチャされたテキストは大文字と小文字を区別しないマッチングの対象にはなりません。

于 2013-01-17T09:39:23.837 に答える
1

あなたの質問から私はあなたが一致したいと思うと思います

  • [A-Za-z]ANDからの文字で構成される文字列のみ
  • 3以上の長さの同じ文字のシーケンスを持たない文字列のみ

次に、この正規表現は機能するはずです。

^(?:([A-Za-z])(?:(?!\1)|\1(?!\1)))+$

perlの例

于 2013-01-17T11:17:00.140 に答える