2

还有什么更经济的正则表达式可以满足以下所有示例:

  • 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})$
4

4 回答 4

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})?)?)?$
于 2013-06-11T12:29:34.427 回答
1

怎么样:

^[A-Z]\.\d{8}(?:\.\d\d(?:\.\d{3}(?:\.\d\d)?)?)?$
于 2013-06-11T12:29:26.220 回答
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));
});

jsfiddle 上

以上我没有尝试优化,还有改进的空间。但是,为了让您了解这里的性能,是上面的jsperf与正则表达式之一。

通过优化,使其比正则表达式更快并完全删除正则表达式是可行的。请参阅测试固定电话号码模式的最快方法

于 2013-06-11T13:20:29.840 回答
0

对于任何数量的人.12.123.12.123....都可以使用:

^[A-Z]\.\d{8}(?:\.\d{2}(?:\.\d{3}\.\d{2})*(?:\.\d{3})?)?$
于 2013-06-11T12:37:38.207 回答