我花了很多時間來找出一個簡單的正則表達式返回一組(僅第1組)。正則表達式返回條件組
所以字符串可以是 - 「沒有購買需要」或「需要$ 50.00價值雜貨採購。」
我想寫一個正則表達式,可以根據給定的字符串解析「否」或「50」。
這是我寫的。
(?:(No) monthly maintenance|Purchase of \$([\d\.]+ worth groceries)
這工作正常,但我希望我的輸出僅作爲第1組/組1。
我花了很多時間來找出一個簡單的正則表達式返回一組(僅第1組)。正則表達式返回條件組
所以字符串可以是 - 「沒有購買需要」或「需要$ 50.00價值雜貨採購。」
我想寫一個正則表達式,可以根據給定的字符串解析「否」或「50」。
這是我寫的。
(?:(No) monthly maintenance|Purchase of \$([\d\.]+ worth groceries)
這工作正常,但我希望我的輸出僅作爲第1組/組1。
爲什麼不直接使用/(?:No monthly maintenance|Purchase of $([0-9.]+) worth groceries)/
。
如果不匹配其中一種格式,匹配將失敗,組1匹配''
作爲「沒有每月維護」的情況或其他案例的編號。
如果你真的需要捕捉串No
或數字,你可能需要變得有點複雜,這樣做:
/(?:Purchase of $)?([0-9.]+|No) (?:monthly maintenance|worth groceries)/
大多數語言算匹配組,才能,無論他們處於非捕獲組((?:...|...)
),因此將有趣的部分強加到第一個捕獲組中可能比它的價值更麻煩。
根據您使用您可能想嘗試使用兩種不同的預編譯的正則表達式,並返回第一個匹配的匹配組,這樣你可以很容易地適應了有趣的部分爲第一組的語言。
我不知道,你可以得到的結果在組號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語言。
現在命名組是非常常見的,但是很少的風格允許在一個正則表達式中使用同一個名字兩次,就像你一樣。這是一個恥辱,因爲這是一個非常方便的功能。 – 2010-04-20 04:35:06
哪種語言是出於好奇而工作的?解析後可能有更好的方法來處理這個問題。 – gnarf 2010-04-19 21:46:30