2010-04-19 66 views
0

我花了很多時間來找出一個簡單的正則表達式返回一組(僅第1組)。正則表達式返回條件組

所以字符串可以是 - 「沒有購買需要」或「需要$ 50.00價值雜貨採購。」

我想寫一個正則表達式,可以根據給定的字符串解析「否」或「50」。

這是我寫的。

(?:(No) monthly maintenance|Purchase of \$([\d\.]+ worth groceries) 

這工作正常,但我希望我的輸出僅作爲第1組/組1。

+0

哪種語言是出於好奇而工作的?解析後可能有更好的方法來處理這個問題。 – gnarf 2010-04-19 21:46:30

回答

1

爲什麼不直接使用/(?:No monthly maintenance|Purchase of $([0-9.]+) worth groceries)/

如果不匹配其中一種格式,匹配將失敗,組1匹配''作爲「沒有每月維護」的情況或其他案例的編號。

如果你真的需要捕捉串No或數字,你可能需要變得有點複雜,這樣做:

/(?:Purchase of $)?([0-9.]+|No) (?:monthly maintenance|worth groceries)/ 
1

大多數語言算匹配組,才能,無論他們處於非捕獲組((?:...|...)),因此將有趣的部分強加到第一個捕獲組中可能比它的價值更麻煩。

根據您使用您可能想嘗試使用兩種不同的預編譯的正則表達式,並返回第一個匹配的匹配組,這樣你可以很容易地適應了有趣的部分爲第一組的語言。

0

我不知道,你可以得到的結果在組號1,但你可以得到兩個結果出現同一命名爲小組。下面是PowerShell的一個例子:

$input1 = 'Purchase of $50.00 worth groceries is required' 
$input2 = 'No monthly maintenance required' 

$re = '(?:(?<xyz>No) monthly maintenance|Purchase of \$(?<xyz>[\d\.]+) worth groceries)' 

$match = [regex]::Match($input1, $re) 
$match.Groups['xyz'] 

$match = [regex]::Match($input2, $re) 
$match.Groups['xyz'] 

導致以下:

Success : True 
Captures : {50.00} 
Index : 13 
Length : 5 
Value : 50.00 

Success : True 
Captures : {No} 
Index : 0 
Length : 2 
Value : No 

並非所有的語言支持命名組雖然。由於PowerShell在.NET Framework上運行,因此適用於任何.NET語言。

+0

現在命名組是非常常見的,但是很少的風格允許在一個正則表達式中使用同一個名字兩次,就像你一樣。這是一個恥辱,因爲這是一個非常方便的功能。 – 2010-04-20 04:35:06