【问题标题】:Regex to match set of two digits seperated by "."正则表达式匹配由“。”分隔的两位数字集
【发布时间】:2020-09-22 18:32:19
【问题描述】:

我正在尝试将正则表达式匹配为仅选择,

两位数字后跟可选的“.”后跟两位数字,后跟可选的“。”后跟两位数字,后跟可选的“。”后跟两位数。

例如,如果输入数据是:

12.45.7810
12345678
12.34.56.78
1.234.56.78
12.45.7816 

预期匹配是:

12345678
12.34.56.78

我正在努力理解为什么以下是错误的:

^\d{2}\.*\d{2}\.*\d{2}\.*\d{2}$

我对上述正则表达式的理解如下:

^ 是行首
后跟两位数字后跟零个或多个. 字符,
后跟两位数字后跟零个或多个. 字符,
后跟两位数字,后跟零个或多个. 字符,
后跟两位数
然后是行尾$

但是,这是匹配行,如 12.45.7816

【问题讨论】:

  • 你为什么不解?由于\.* 匹配7816 之间的空字符串,因此12.45.7816 中存在匹配。您可能只需要^\d{2}(?:\.\d{2}\.\d{2}\.\d{2}|\d{6})$,或者简称为^\d{2}(?:(?:\.\d{2}){3}|\d{6})$。那是你要的吗?仅当 所有 位对之间有点或根本没有点时才匹配点?
  • 是的,这产生了正确的结果。我现在正试着把它浸泡在我的脑海里:)

标签: regex pcre


【解决方案1】:

由于\.* 匹配7816 之间的空字符串,因此12.45.7816 匹配。

要仅匹配所有数字对之间存在的点,或者根本不匹配点,您可以使用

^\d{2}(?:(?:\.\d{2}){3}|\d{6})$

its graph:

regex demo

详情

  • ^ - 字符串开头
  • \d{2} - 两位数
  • (?:(?:\.\d{2}){3}|\d{6}) - 两种选择之一:
    • (?:\.\d{2}){3} - 出现三个点,后跟两个数字
    • | - 或
    • \d{6} - 六位数
  • $ - 字符串结束

【讨论】:

    猜你喜欢
    • 2013-08-11
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    相关资源
    最近更新 更多