Javascript正则表达式建议

时间:2016-04-12 21:09:49

标签: javascript regex

我有以下正则表达式:

/^[0-9]{8}([a-z]{1})?|[0-9]{3}-[0-9]{2}-[0-9]{3}([a-z]{1})?/

我试图匹配以下模式12345678,12345678a(任意1个字符),123-45-678,123-45-678a(任意1个字符)。
问题是如果我输入123456789,由于第一个条件[0-9] {8},它仍然有效。我搜索了我是否可以使用某种AND运算符,但没有找到任何东西。有没有为什么要为每个条件添加到我的正则表达式以匹配长度。示例[0-9] {8}也必须匹配确切的长度?所以12345678是正确的但是123456789失败了吗?

更新1

你们给了我很好的例子。这绝对让我的表达更小。我仍然面临的唯一问题是以下JavaScript代码:

var regExp = new RegExp(/^\d{3}-?\d{2}-?\d{3}[a-z]?/g);
var isValid = regExp.test('12345678');
isValid is true

var isValid = regExp.test('12345678d');
is valid 

the problem is if I enter
var isValid = regExp.test('12345678dd');
is also valid because of 12345678d

Since test() is used to find a match.  Is there a way to test the exact phrase of the regular expression so that 12345678dd fails?

更新2 好吧,我完全错过了Everyone示例中的结尾$。我非常感谢你的帮助

2 个答案:

答案 0 :(得分:2)

修复正则表达式的一种方法是:

/^\d{3}(-?)\d{2}\1\d{3}[a-z]?$/

<强>解释
^ =字符串的开头
\d =从0到9的任意1位数字,与[0-9]相同 {3} =前一次事件正好出现3次,在这种情况下为\d
-? =可选-
(<part-of-regex-here>) =捕获从1开始编号的匹配,可以在正则表达式中引用为\1
[a-z] =任何小写字母


$ =字符串结尾

Demo on RegexPal.com

响应更新1:

如果你试试我的正则表达式:

&#13;
&#13;
var regExp = new RegExp(/^\d{3}-?\d{2}-?\d{3}[a-z]?$/);
var isValid = regExp.test('12345678');
console.log(isValid);

isValid = regExp.test('12345678d');
console.log(isValid);

isValid = regExp.test('12345678dd');
console.log(isValid);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

你可以使用/^(?:\d{8}|\d{3}-\d{2}-\d{3})[a-z]?$/,注意字符串的开头(^)和结尾($)的锚点。

我还使用了\d代替[0-9]因为它更短且更具可读性,并将[a-z]?置于交替之外。无需使用{1}

这是Regex101

的演示