匹配完整的重复模式

Matching a full repeating pattern

我似乎无法理解这个正则表达式 https://regex101.com/r/cQ9nK8/38

这些应该匹配

这不应该匹配

如您所见,它们是单独匹配的,但不是整体匹配的,我认为这行得通,但行不通

(?:[[:alnum:]]+(?:\.\d+)*)*

您可以使用重复模式:

  • 首先匹配 [[:alpha:]],然后是可选的 [[:alnum:]](如果由点分隔的 2 部分中的第一部分不应以数字开头)

    这将匹配 January

  • 后面跟一个匹配数字的可选部分

    这将匹配 January.313

  • 可选地重复一个点后跟相同的图案

    这将匹配最后 3 个示例。

模式

^[[:alpha:]][[:alnum:]]*(?:\.[[:digit:]]+(?:\.[[:alpha:]][[:alnum:]]*\.[[:digit:]]+)*)?$

Regex demo

没有 POSIX 符号的版本可能是

^[a-zA-Z][a-zA-Z0-9]*(?:\.[0-9]+(?:\.[a-zA-Z][a-zA-Z0-9]*\.[0-9]+)*)?$
  • ^ 字符串开头
  • [a-zA-Z][a-zA-Z0-9]* 匹配一个字符 a-zA-Z 可选后跟 a-zA-Z 和数字
  • (?:非捕获组
    • \.[0-9]+ 匹配一个 . 和 1+ 个数字
    • (?:\.[a-zA-Z][a-zA-Z0-9]*\.[0-9]+)* 可选地重复匹配 . 一个字符 a-zA-Z 可选地后跟 a-zA-Z 和数字,一个点和数字
  • )? 关闭组并使其可选
  • $ 字符串结束

Regex demo

这是我的尝试:

^((?:^|\.)[A-Z][A-Z\d]*(?:$|\.\d+))(?1)*$

在线查看demo


  • ^ - 开始字符串 ancor。
  • ( - 打开第一次捕获 group/pattern。
    • (?: - 打开非捕获组。
      • ^|\. - 开始字符串或文字点。
      • ) - 关闭非捕获组。
    • [A-Z][A-Z\d]* - 一个字母后跟零个或多个字母或数字。
    • (?: - 打开非捕获组。
      • $|\. - 结束字符串或文字点。
      • ) - 关闭非捕获组。 ) - 关闭第一次捕获 group/pattern。
  • (?1)* - 重复捕获 group/pattern 零次或多次。
  • $ - 结束字符串锚点。

顺便说一句,我使用了不区分大小写的匹配。