匹配前缀和多个可选后缀,没有分隔符

时间:2017-07-13 16:38:01

标签: php regex

我正在尝试匹配带有前缀和两个可选后缀的字符串,这些后缀可以按任何顺序排列,其中前缀和每个后缀分别分组,例如。

input       => groups
!attackH5E4 => (attack, H5, E4)
!attackE4H5 => (attack, H5, E4)
!HHHHHHH5   => (HHHHHH, H5, null)
!HHHHHHH5E4 => (HHHHHH, H5, E4)
!HHHHHHH5E4 => (HHHHHH, H5, E4)
!HHHHHHH5E4 => (HHHHHH, H5, E4)

我目前使用的正则表达式是

!([^\s]+)(?:(H\d+)|(E\d+)){0,2}

其中组1是前缀(例如attack),组2是H修饰符(例如H5),组3是E修饰符(例如E4

原样,第2组和第3组被第1组吞没。将?投掷到[^\s]+使其仅与第一个字符匹配。将$投掷到后缀非捕获组中根本不起作用,除非我取消{0,2}

Here's a RegExr fiddle for the pattern, with test inputs and expected groups.

1 个答案:

答案 0 :(得分:2)

您可以使用

/^!(\S+?)(?:(H\d+)|(E\d+)){0,2}$/

请参阅regex demo

<强>详情:

  • ^ - 字符串开头
  • ! - !符号
  • (\S+?) - 任意1个非空格符号,尽可能少
  • (?:(H\d+)|(E\d+)){0,2} - 0到2个序列:
    • (H\d+) - 第2组:H和1+位数
    • | - 或
    • (E\d+) - 第3组:E,然后是1位或更多位数
  • $ - 字符串结束。

请注意[^\s]等于\S,只有当您需要限制[^\s]模式(比如匹配任何非空格)时才使用\S但是一些特定的字符。)