2013-07-19 61 views
0

我需要验证一个字符串,该字符串可以包含任意数量的字符,逗号和2个字符。我有一些问题。下面是我有:正则表达式问题 - 字符限制和空白忽略

var str="ab,cdf"; 
var patt1=new RegExp("[A-z]{2,}[,][A-z]{2}"); 
if(patt1.test(str)) { 
    alert("true"); 
} 
else { 
    alert("false"); 
} 

我希望它可以返回false,因为我对角色的{2}限制逗号后,这串具有三个字符。但是,当我运行fiddle时,它会返回true。我对RegExp的理解(当然是有限的)表明{2,}至少是2,而{2}恰好是2,所以我不确定为什么在逗号后面的三个字符仍然返回true。

我还需要能够忽略逗号和其余两个字符之间可能的空格。 (换句话说,如果它们在逗号之前有2个字符,而在它之后有两个字符,那么我希望它返回true - 两个之后它不包括用户可能已输入的任何空格。)

所以所有这些应该返回true:

var str = "ab, cd"; 
var str = "abc, cd"; 
var str = "ab,cd"; 
var str = "abc,dc"; 

我已经试过逗号这样以后添加\S指标:

var patt1=new RegExp("[A-z]{2,}[,]\S[A-z]{2}"); 

但随后的字符串返回false所有的时间,甚至当我有它设置为ab, cd,这应该返回true。

我错过了什么?

+0

[你摆弄的代码(http://jsfiddle.net/EmmyS/z2fTr /)实际上与[您的问题的代码](http://stackoverflow.com/q/17751150/578288)不同。它表示“{2,}”而不是“{2}”。但这不是问题;当我解决这个问题时,你的小提琴仍然会提示'真实'。 –

+0

你的'\ S'问题(除了它应该是'\ s'的事实)是字符串转义。你在''''引号内加载你的正则表达式,而不是'''文字的语法,所以你需要在你引用内的任何'\'字符转义为\\'。 –

+0

尝试http://regexpal.com/这是很好的实验。 – Jacob

回答

2

{2,}至少为2,和{2}恰好是两个,所以我米不知道为什么三个字符后逗号仍然返回true。

这是正确的。你忘记的是anchor你的表达式以字符串开始和结束 - 否则当发生在字符串的某处时返回true。

不包括任何空白:我已经试过了逗号

这是完全相反的后面添加\ S指示器。\s匹配空白字符,\S匹配所有非空白字符。此外,您可能需要一些空白的optional repetition,而不是需要确切的一个。

[A-z] 

注意,这个字符范围还包括Za,即[]^_`之间的字符。您可能会想要[A-Za-z],或使用[a-z]并使您的正则表达式不区分大小写。

结合起来,这是你的正则表达式应该是什么样子(使用而不是regular expression literalRegExp构造函数用于字符串):

var patt1 = /^[a-z]{2,},\s*[a-z]{2}$/i; 
+0

谢谢!这工作。我很少需要正则表达式,所以我没有花太多时间来处理它,而小变幻莫测可以带来很大的改变。 – EmmyS

1

你缺少^$。还有的范围应该是[a-zA-Z][A-z]

你的正则表达式应该是

^[a-zA-Z]{2,}[,]\s*[A-Za-z]{2}$ 

^会从一开始就匹配字符串...

$会匹配字符串直到结束。

没有$^它会在任何地方匹配字符串之间

\s*将匹配0到很多空间..

+0

对于任何字母字符,[A-z]都返回true,而不管大小写。 (或者似乎在我的测试中) – EmmyS

+1

@EmmyS它也会匹配'[',\,']','^','_' ..请参阅ascii表 – Anirudha