0

我花了很多时间找出一个简单的正则表达式来返回一个组(只有第一组)。

所以字符串可以是 - “无需购买”或“需要购买价值 50.00 美元的杂货”。

我正在尝试编写一个正则表达式,它可以根据给定的字符串解析“No”或“50”。

这就是我写的。

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

这工作正常,但我希望我的输出仅作为第 1 组/第 1 组。

4

3 回答 3

2

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

如果不是其中一种格式,则匹配将失败,并且第 1 组匹配''“无每月维护”案例或其他案例的数字。

如果您真的需要捕获字符串No或数字,您可能需要变得更复杂一些并执行以下操作:

/(?:Purchase of $)?([0-9.]+|No) (?:monthly maintenance|worth groceries)/
于 2010-04-19T21:47:35.753 回答
1

大多数语言按顺序计算匹配组,无论它们是否在非捕获组 ( (?:...|...)) 中,因此将有趣的部分强制放入第一个捕获组可能比它的价值更麻烦。

根据您使用的语言,您可能想尝试使用两个不同的预编译正则表达式并返回第一个匹配项的匹配组,这样您就可以轻松地将有趣的部分放入第一组。

于 2010-04-19T22:01:16.300 回答
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 语言。

于 2010-04-19T22:06:28.533 回答