2017-07-13 33 views
3

我想要正则表达式匹配字符串有一个前缀和两个可选的后缀,可以以任何顺序,其中前缀和每个后缀单独分组,例如,匹配的前缀和多个可选的后缀没有分隔符

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

那么问题是什么? – kirkpatt

+2

参见['^!(\ S +?)(?:(H \ d +)|(E \ d +)){0,2} $'](https://regex101.com/r/F8L4kh/3)。我认为你需要将这些字符串解析为独立的字符串,对吧? –

+0

@kirkpatt“我正在尝试使用正则表达式匹配字符串,该字符串具有前缀和两个可选后缀,可以按任意顺序排列,前缀和每个后缀分别分组。编辑澄清。对不起,我认为这很明显。 – user2706191

回答

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](比如,匹配任何非空白,但某些特定的字符)。

+1

一个有趣的事实:这个技巧与量化一个非捕获组内有几个捕获组内部以任何顺序匹配它们将无法在JavaScript中工作。但是对于PCRE,这是可能的,因为在下一次迭代时未参与的团队不会被清除。 –

+1

非常感谢您的详细分解!这是非常有用的。 – user2706191