什么是更经济的RegEx,满足以下所有示例:

时间:2013-06-11 12:24:56

标签: javascript regex

更符合以下所有示例的更经济的RegExp:

  • 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 个答案:

答案 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));
});

jsfiddle

我没有尝试优化上述内容,还有改进的余地。但是,为了让你对这里的表现有所了解是上面的jsperf与其中一个正则表达式。

通过优化,使其比正则表达式更快,并完全删除正则表达式是可行的。见Fastest method for testing a fixed phone number pattern