2016-08-24 36 views
0

我不明白为什么这些正则表达式无法正常工作。只接受字母和空格,数字和空格,以及在不同的框中输入空格的字母和数字

我需要3种不同类型的表达式检查,但是这些方法并不像他们所想的那样完全工作。他们的工作“部分”,如#output2的例子所示,其中响应结果是无效的,但它并没有捕获第一个。我假设有一些我很想念的东西?

我尝试做以下验证...

编辑澄清SORRY!

var letters - 只能接受绝对没有数字或特殊字符的字母,但仍允许空格,但最多只能有1个空格(因此不能有双空格),并且不能以空格开头或结尾。一个空字符串仍然应该通过有效。

var digits - 与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

我不完全理解你的每个正则表达式的意图是什么。你能否准确解释你想验证的模式? (例如:“一系列字母,后跟一个或两个空格,等等”)。 –

回答

2

您需要锚^添加到您的正则表达式的开始,所以它的整体价值,而不仅仅是值的末尾匹配。

要使某些选项可用,请按照?进行操作。为了最多允许一个空间之间的空间,做一个以可选空格结束的表达式。要允许空输入,请将^$之间的所有内容都设为可选项。

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的空白应该仍然被认为是有效的。这就是为什么我认为我不得不忽略^来表明他们都是可选的。我现在明白,它关于*,但是我所拥有的解决方案仍然不起作用。我会更好地解释一下 – eqiz

+1

如果你想让整个事情可选,把'(...)?'放在它的周围:'^(...)?$'。 – Barmar

+0

或者您可以将'+'更改为'*',因为它匹配0次或更多次,而不是1次或更多次。 – Barmar

相关问题