Javascript正则表达式建议

Javascript regular expression advice

本文关键字:正则表达式 Javascript      更新时间:2024-05-30

我有以下正则表达式:

/^[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-45678a(任意一个字符)
问题是,如果我输入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例子中的结尾$。我非常感谢你的帮助

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

/^'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]=任何小写字母
$=字符串结束

RegexPal.com上的演示

响应更新1:

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

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);

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

我还使用了'd而不是[0-9],因为它更短、更可读,并将[a-z]?放在了交替之外。从没有必要使用{1}

以下是Regex101 的演示