更符合以下所有示例的更经济的RegExp:
强制要求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})$
答案 0 :(得分:4)
您可以做一些改进:
{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})?)?)?$
答案 1 :(得分:1)
怎么样:
^[A-Z]\.\d{8}(?:\.\d\d(?:\.\d{3}(?:\.\d\d)?)?)?$
答案 2 :(得分:0)
对于任意数量的.12.123.12.123....
,您可以使用此功能:
^[A-Z]\.\d{8}(?:\.\d{2}(?:\.\d{3}\.\d{2})*(?:\.\d{3})?)?$
答案 3 :(得分:0)
作为创建和维护可能是一个困难的正则表达式的替代方法,您可以使用类似的东西来验证字符串。
的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与其中一个正则表达式。
通过优化,使其比正则表达式更快,并完全删除正则表达式是可行的。见Fastest method for testing a fixed phone number pattern