【问题标题】:Whats more economical RegExp that fulfill all example below:还有什么更经济的 RegEx 可以满足以下所有示例:
【发布时间】:2013-06-11 12:24:55
【问题描述】:

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

  • 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 个字符,我假设大写现代拉丁字母,由您原来的正则表达式?

标签: javascript regex


【解决方案1】:

您可以进行一些改进:

{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})?)?)?$

【讨论】:

  • 为了进一步压缩,\d\d\d{2} 短;)
  • @thg435 是的,我只在不与其他 {n} 混合时使用它。但是,是的,这又是一个品味问题。我可能会包括它。
  • 谢谢 m.buettner...真的很及时的回应...'是的,最后一个是发布问题时的类型。
【解决方案2】:

怎么样:

^[A-Z]\.\d{8}(?:\.\d\d(?:\.\d{3}(?:\.\d\d)?)?)?$

【讨论】:

  • 你忘记了第二个点和锚点!
【解决方案3】:

对于任意数量的.12.123.12.123....,您可以使用:

^[A-Z]\.\d{8}(?:\.\d{2}(?:\.\d{3}\.\d{2})*(?:\.\d{3})?)?$

【讨论】:

  • 谢谢-Casimir et Hippolyte
【解决方案4】:

作为创建和维护可能很困难的正则表达式的替代方法,您可以使用类似的方式验证字符串。

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

【讨论】:

    猜你喜欢
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 2021-09-29
    • 2020-10-04
    相关资源
    最近更新 更多