2010-04-19 67 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