2017-09-30 14 views
-6

3つ以上の[aA-zZ]文字を必要とするテキストを検証したい場合、連続して使用する必要はありません。Regex 3文字以上の英文テキストを検索する

/^(?![_\-\s0-9])(?!.*?[_\-\s]$)(?=.*[aA-zZ]{3,})[_\-\sa-zA-Z0-9]+$/.test("aaa123") => trueを返します。 /^(?![_\-\s0-9])(?!.*?[_\-\s]$)(?=.*[aA-zZ]{3,})[_\-\sa-zA-Z0-9]+$/.test("a1b2c3") => falseを返します。

誰かが私を助けることができますか?

+0

https://regex101.com/ – jdv

答えて

0

あなたは英語の文字間の任意の任意の文字を可能にするためにグループ.*[a-zA-Z]する必要があります。

^(?![_\-\s0-9])(?!.*?[_\-\s]$)(?=(?:.*[a-zA-Z]){3,})[_\-\sa-zA-Z0-9]+$ 
           ^^^  ^
            Add this 

デモ:ところで

var re = /^(?![_\-\s0-9])(?!.*?[_\-\s]$)(?=(?:.*[aA-zZ]){3,})[_\-\sa-zA-Z0-9]+$/; 
 
console.log(re.test("aaa123")); 
 
console.log(re.test("a1b2c3"));

[aA-zZ]があります正しい範囲定義ではありません。代わりに[a-zA-Z]を使用してください。詳細はhereを参照してください。

0

交換とカウントはどうですか?正規表現の

var hasFourPlusChars = function(str) { 
 
    return str.replace(/[^a-zA-Z]+/g, '').length > 3; 
 
}; 
 

 
console.log(hasFourPlusChars('testing1234')); 
 
console.log(hasFourPlusChars('a1b2c3d4e5'));

+0

実行時間が長くなります。 –

+0

私は実際に最速の実行がfor-loopとカウンタだと思っています!しかし、一度だけ、ユーザーが開始したコードでは、私はあまりにもスピードの違いにはほとんどストレスを感じません。 – arbuthnott

+0

私はパフォーマンスがコードを実行する必要がある時間のnubmerに依存することに同意します。 **この方法をスピードテストに追加しました。これは最も遅い(これまでの最も速い実装の半分のスピードです)。 –

0

修正

あなたのリピート条件が含まれるべきです "*"。あなたの正規表現は、あなたが達成したいもののために正しいかどうかはチェックしませんでしたが、この補正は、次の文字列のために働く:

$testStrings=["aaa123","a1b2c3","a1b23d"]; 
foreach($testStrings as $s) 
    var_dump(preg_match('/^(?![_\-\s0-9])(?!.*?[_\-\s]$)(?=.*[a-zA-Z]){3,}[_\-\sa-zA-Z0-9]+$/', $s)); 

他の実装

言語はJavaScriptのように思わとして、ここでは最適化されていますあなたが達成したい何のための実装:

"a24be4Z".match(/[a-zA-Z]/g).length>=3 

我々はすべてのマッチのリストを取得し、少なくとも3 は、結果を作成する必要があるとして、「最速」の方法ではないことがあるかどうかを確認します。 )

/(?:.*?[a-zA-Z]){3}/.test("a24be4Z") 

がより高速です。 "。*?"他の組み合わせをテストする前に、 "test"メソッドが文字列の末尾までのすべての文字と一致することを避けます。

期待どおり、最初の提案(一致の数を数える)は最も遅いです。 チェックhttps://jsperf.com/check-if-there-are-3-ascii-characters

関連する問題