我花了很多时间来找出一个简单的正则表达式返回一组(仅第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