我正在尝试匹配带有前缀和两个可选后缀的字符串,这些后缀可以按任何顺序排列,其中前缀和每个后缀分别分组,例如。
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.
答案 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
但是一些特定的字符。)