2017-07-13 38 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