23

XSL ファイル内の同じ文字/数字を 2 つまで正規表現で処理する必要があります。

  • 立つ瀬がない
  • 特殊文字をサポートしていません
  • サポート (az、AZ、0-9)
  • az のいずれかが必要
  • 0 ~ 9 のいずれかが必要
  • 同じ文字/数字は 2 つまで (つまり、BBB失敗し、BB受け入れられます)

私がこれまでに持っているもの

(?:[^a-zA-Z0-9]{1,2})
4

5 に答える 5

32

この正規表現はそれを行います: ^(?!.*([A-Za-z0-9])\1{2})(?=.*[a-z])(?=.*\d)[A-Za-z0-9]+$

内訳は次のとおりです。

(?!.*([A-Za-z0-9])\1{2})文字が連続して 2 回以上繰り返されないようにします。

(?=.*[a-z])少なくとも 1 つの小文字が必要です

(?=.*\d)少なくとも 1 桁が必要です

[A-Za-z0-9]+文字と数字のみを許可します

編集:.*否定的な先読みから 余分なものを削除しました

于 2013-07-31T14:56:17.827 に答える
26

(部分的な解決策) 同じ文字が 3 回以上連続して一致する場合は、次を試してください。

([a-zA-Z0-9])\1{2,}

一致の例 (ここここの両方でテスト): AABBAA(一致なし)、AABBBAAA(一致BBBおよびAAA)、ABABABABABABABA(一致なし)、ABCCCCCCCCCC(一致CCCCCCCCCC)。

于 2013-07-31T14:53:47.180 に答える
6

これはあなたのために働きますか?

/(\b(?:([A-Za-z0-9])(?!\2{2}))+\b)/

やってみて:

var regex = new RegExp(/(\b(?:([A-Za-z0-9])(?!\2{2}))+\b)/)
var tests = ['A1D3E', 'AAAA', 'AABAA', 'abccddeeff', 'abbbc', '1234']

for(test in tests) {
   console.log(tests[test] + ' - ' + Boolean(tests[test].match(regex)))
}

出力します:

A1D3E - true
AAAA - false
AABAA - true
abccddeeff - true
abbbc - false
1234 - true
于 2013-07-31T15:15:33.903 に答える
1

明確化に応じて、単一の正規表現は厳密には必要ないようです。その場合、いくつかの正規表現または関数を使用することをお勧めします。私の推測では、パフォーマンスは要件ではありません。通常、これらの種類のチェックはユーザー入力に応じて行われるからです。ユーザー入力の検証には 100 ミリ秒かかる場合がありますが、それでも瞬時に表示され、100 ミリ秒で多くのコードを実行できます。

たとえば、私は個人的に、個別のテストで各条件のチェックを行います. まず、スペースを確認します。次に、少なくとも 1 つの文字を確認します。次に、少なくとも 1 つの番号を確認します。最後に、3 つ以上の繰り返し文字のスパンを探します。

コードははるかに理解しやすくなり、後でルールを変更するのもはるかに簡単になります (これは経験上、ほぼ確実に起こります)。

例えば:

function do_validation(string) {
    return (has_no_space(string) &&
            has_no_special_char(string) &&
            has_alpha(string) &&
            has_digit(string) &&
            ! (has_repeating(string)))

個人的には、上記は 1 つの複雑な正規表現よりも桁違いに読みやすいと考えています。さらに、ルールを追加または削除しても、複雑な正規表現を再実装する必要はありません (したがって、すべての可能な組み合わせを再テストする必要があります)。

于 2013-07-31T14:53:37.110 に答える