2017-04-02 70 views
1

我有一個字符串,它看起來像的端部執行以下操作:正則表達式,任選捕捉3組在串

VAL "foo" 
VAL2 "bar" 
VAL3 "barbar" 
OPTIONALVAL "optionalvalue" 
SPECIALVAL "optionalval" 

哪裏OPTIONALVAL是可選的(可以或可以不出現),並且如果它出現那麼它有第二列中的值對(示例中的"optionalvalue")和SPECIALVAL也是可選的,但它在第二列中沒有配對值。

這是我的正則表達式,但它不匹配任何東西,如果OPTIONALVAL丟失(應匹配所有其他不丟失的)!

"^[[:space:]]*" 
"(VAL)[[:space:]]*\"(.*)\"[[:space:]]*" 
"(VAL2)[[:space:]]*\"(.*)\"[[:space:]]*" 
"(VAL3)[[:space:]]*\"(.*)\"[[:space:]]*" 
"(OPTIONALVAL)?[[:space:]]*\"(?(7)(.*))\"[[:space:]]*"; // conditional capture 
"(SPECIALVAL)?[[:space:]]*"; 

我在做什麼錯? (我用的升壓正則表達式,:space:應相當於空格字符。

+0

您正在使用哪種正則表達式引擎? – Vallentin

+0

@Vallentin默認來自 so Perl –

回答

2

爲了您條件捕捉,你可以這樣做(?:xyz)?其中xyz是有條件的格局。

VAL\s*"(.*?)"\s* 
VAL2\s*"(.*?)"\s* 
VAL3\s*"(.*?)"\s* 
(?:OPTIONALVAL\s*"(.*?)"\s*)? 
SPECIALVAL 

Live preview

請注意,實時預覽啓用了擴展標誌,忽略這些換行符。

由於你的問題反映你想要捕獲VAL等等,那麼你當然需要用圓括號包圍它們。

需要注意的是,有條件捕獲是否存在。所有捕獲組仍將保持相同的索引方式。

+0

感謝您的回答,但是如果存在OPTIONALVAL和/或SPECIALVAL,那麼我也想要捕獲它們。我正在擺弄你的正則表達式,出於某種原因,我沒有爲它們找到匹配。即我想捕捉第一列和第二列中出現的所有內容。 –

+0

你只需要用圓括號包圍它們。 [這是一個非常豐富多彩的實時預覽。](https://regex101.com/r/6l4Zy5/2) – Vallentin

+0

啊,我明白了,謝謝! –