2016-08-24 19 views
0

これらの正規表現が正しく機能しない理由を理解できません。は、文字とスペース、数字とスペース、および異なるボックスにスペースを含む文字と数字のみを受け入れます。

私は3種類の式チェックが必要ですが、それらの方法は完全には動作していません。 #output2の例に示すように、「部分的に」動作しますが、応答が無効であることが分かりますが、最初の応答をキャッチしません。私は何か小さなものがあると思っています。

私は、次の検証をやろうとしている...明確化SORRY FOR

EDIT!

文字は絶対に数字も特殊文字も使用できませんが、スペースは使用できますが、最大スペースは1つのみ(したがって二重スペースはありません)、スペースで終わることはできません。空文字列は有効なものとして渡されます。

varの数字 - varの文字と同じですが、数字は特殊文字を含まない文字ではありません。先導または訓練のスペースや二重スペースはどこにもありません。空白の入力はまだ有効です。

var lettersDigits - 特殊文字を含まない文字と数字のみを許可します。先導または訓練のスペースや二重スペースはどこにもありません。空白の入力はまだ有効です。

https://jsfiddle.net/umdhh5fb/

var value = '2 a s 2 s 2 a'; 
var valueInValid = 'a a a a a 2' 
var valueDigits = '12321 asda 12312 2'; 

var letters = /([a-zA-Z]+\s)*[a-zA-Z]+$/; // only letters with no more than 2 spaces 
var digits = /[\d+\s]*[\d]+$/; // only digits with no more than 2 spaces 

var lettersDigits = /[a-zA-Z\d+\s]*[a-zA-Z\d]+$/; // digits and letters allowed no special characters no more than 2 spaces 

if (letters.test(value) == false) { 
$("#output").text("invalid"); 
} else { 
$("#output").text("valid"); 
} 

if (letters.test(valueInValid) == false) { 
$("#output2").text("invalid"); 
} else { 
$("#output2").text("valid"); 
} 


if (digits.test(valueDigits) == false) { 
$("#output3").text("invalid"); 
} else { 
$("#output3").text("valid"); 
} 


if (lettersDigits.test(value) == false) { 
$("#output4").text("invalid"); 
} else { 
$("#output4").text("valid"); 
} 


<div id="output"></div> /* returns valid */ 
<div id="output2"></div> /* returns invalid */ 
<div id="output3"></div> /* returns valid */ 
<div id="output4"></div> /* returns valid */ 
+0

これはJavascriptを、HTMLではないです。 – Barmar

+0

正規表現は '^'で文字列の先頭に固定されていません。だから彼らは値の全体ではなく、値の終わりをテストするだけです。 – Barmar

+0

あなたの正規表現のそれぞれの意図は完全にわかりません。検証するパターンを正確に説明できますか? (例:「一連の文字、その後に1つまたは2つのスペースが続く」など)。 –

答えて

2

あなたはそれが全体の価値、価値のないだけで終わりに一致するように、あなたの正規表現の先頭にアンカー^を追加する必要があります。

何かを任意にするには、?に従ってください。物事間に最大1つのスペースを許すには、オプションのスペースで終わる式を作成します。空の入力を許可するには、^$の間のすべてをオプションにします。

var value = '2 a s 2 s 2 a'; 
 
var valueInValid = 'a a a a a 2' 
 
var valueDigits = '12321 asda 12312 2'; 
 

 
var letters = /^(([a-z]+\s)?[a-z]+)?$/i; // only letters with no more than 1 spaces 
 
var digits = /^((\d+\s)?\d+)?$/; // only digits with no more than 1 spaces 
 

 
var lettersDigits = /^(([a-z\d]+\s)?[a-z\d]+)?$/i; // digits and letters allowed no special characters no more than 1 spaces 
 

 
if (letters.test(value) == false) { 
 
    $("#output").text("invalid"); 
 
} else { 
 
    $("#output").text("valid"); 
 
} 
 

 
if (letters.test(valueInValid) == false) { 
 
    $("#output2").text("invalid"); 
 
} else { 
 
    $("#output2").text("valid"); 
 
} 
 

 
if (digits.test(valueDigits) == false) { 
 
    $("#output3").text("invalid"); 
 
} else { 
 
    $("#output3").text("valid"); 
 
} 
 

 
if (lettersDigits.test(value) == false) { 
 
    $("#output4").text("invalid"); 
 
} else { 
 
    $("#output4").text("valid"); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<div id="output"></div> 
 
<div id="output2"></div> 
 
<div id="output3"></div> 
 
<div id="output4"></div>

+0

Barmar私は謝罪しますが、空白になっているvarが有効であると見なされるべきではないことを断りました。だから私は、彼らがすべてのオプションであることを示すために^を省略しなければならないと思ったのはなぜですか。私は今、その*についてのことを理解していますが、私はorignallyまだ解決策は動作しません。もっと説明してみよう – eqiz

+1

全体をオプションにしたい場合は '^(...)?$'のように '(...)?'を書いてください。 – Barmar

+0

あるいは、 '+'を '*'に変更することができます。これは、1回以上ではなく、0回以上一致するためです。 – Barmar

関連する問題