还有什么更经济的正则表达式可以满足以下所有示例:
- W.12345678
- W.12345678.12,
- W.12345678.12.123
- W.12345678.12.123.12
1 个字符(8 位)必须后跟 (.) 和 2、3、2 位的组合。
我发现 :-
^[A-Z]{1}\.\d{8}(?:\.\d{2}|\.\d{2}\.\d{3}|\.\d{2}\.\d{3}\.\d{2}|\.\d{2}\.\d{3}\.\d{2})$
还有什么更经济的正则表达式可以满足以下所有示例:
1 个字符(8 位)必须后跟 (.) 和 2、3、2 位的组合。
我发现 :-
^[A-Z]{1}\.\d{8}(?:\.\d{2}|\.\d{2}\.\d{3}|\.\d{2}\.\d{3}\.\d{2}|\.\d{2}\.\d{3}\.\d{2})$
您可以进行一些改进:
{1}
从不做任何事情。所以放下它。
您的最后两个选择是相同的。所以放弃最后一个。那会给
^[A-Z]\.\d{8}(?:\.\d{2}|\.\d{2}\.\d{3}|\.\d{2}\.\d{3}\.\d{2})$
最后,如果您愿意,可以使用可选部分而不是替代部分:
^[A-Z]\.\d{8}(?:\.\d{2}(?:\.\d{3}(?:\.\d{2})?)?)?$
这是否更具可读性取决于您。正如 thg435 指出的那样,您可以通过展开{2}
^[A-Z]\.\d{8}(?:\.\d\d(?:\.\d{3}(?:\.\d\d)?)?)?$
但我个人不喜欢将{n}
量词与写出的重复混合在一起,从中获得的收益是值得怀疑的。
此外,在已经包含大量反斜杠的正则表达式中,我更喜欢单字符类而不是适用的转义(但这是一个口味问题),所以这里有一个替代方案:
^[A-Z][.]\d{8}(?:[.]\d{2}(?:[.]\d{3}(?:[.]\d{2})?)?)?$
怎么样:
^[A-Z]\.\d{8}(?:\.\d\d(?:\.\d{3}(?:\.\d\d)?)?)?$
作为创建和维护可能很困难的正则表达式的替代方法,您可以使用类似的方式验证字符串。
Javascript
var strings = [];
strings.push("W.12345678");
strings.push("W.12345678.12");
strings.push("W.12345678.12.123");
strings.push("W.12345678.12.123.12");
function verify(string) {
var parts = string.split("."),
length = parts.length,
lengths = [1, 8, 2, 3, 2],
index = 1,
part;
if (length < 2 || length > 5 || (part = parts[0]).length !== lengths[0] || part.search(/[^A-Z]/) !== -1) {
return false;
}
while (index < length) {
part = parts[index];
if (part.length !== lengths[index] || part.search(/[^\d]/) !== -1) {
return false;
}
index += 1;
}
return true;
}
strings.forEach(function (string) {
console.log(string, verify(string));
});
以上我没有尝试优化,还有改进的空间。但是,为了让您了解这里的性能,是上面的jsperf与正则表达式之一。
通过优化,使其比正则表达式更快并完全删除正则表达式是可行的。请参阅测试固定电话号码模式的最快方法
对于任何数量的人.12.123.12.123....
都可以使用:
^[A-Z]\.\d{8}(?:\.\d{2}(?:\.\d{3}\.\d{2})*(?:\.\d{3})?)?$