2017-08-11 94 views
2

中的同一組我必須解析一個字符串,格式爲!info1!info2!,並且info2是可選的。如何強制兩種模式捕獲到regEx

我想捕獲,如果需要,使用正則表達式,info1info2

我想出了以下模式:

!([^!]*?)!(.*?)!|!(.*?)! 

它的工作原理,但我不滿意的結果:

!foo!bar! -> Group1: foo Group2:bar 
!foo!  -> Group3: foo 
(https://regex101.com/r/D9d6YP/1) 

在這兩種表達,foo意味着同樣的事情,而且是之後以相同的方式進行處理。我想在同一組中捕捉它,不管是否有第二組。

我曾嘗試使用命名捕獲組,但它似乎是他們不能被重用

!(?<info1>[^!]*?)!(?<info2>.*?)!|!(?<info1>.*?)! 

失敗,一個子模式名稱必須是唯一的錯誤信息」。

有什麼辦法可以捕捉同一組中的不同模式嗎?

+0

Pleae提供沒有可選部分的示例字符串。 – HBP

+0

您的regex101鏈接似乎暗示您正在使用PCRE模式?那是對的嗎? –

+0

不,它是.NET,regex101中的風格只是默認的。 – Maxime

回答

1

你可以使用一個可選的非捕獲組合並這兩個替代成一個單一的分支:

!([^!]*)!(?:([^!]*)!)? 
     ^^^  ^^ 

regex demo

詳細

  • ! - 一個!
  • ([^!]*) - 第1組:比其他任何0+字符!
  • ! - 一個!
  • (?:([^!]*)!)? - 任選的非捕獲組(其結果沒有存儲在存儲器中,沒有ID被分配給它)匹配1或0的
    • ([^!]*)出現 - 組2:比!
    • !其他任何0+字符 - 一個!
+1

真棒技巧,書籤! 謝謝 – Maxime