我花了很多时间找出一个简单的正则表达式来返回一个组(只有第一组)。
所以字符串可以是 - “无需购买”或“需要购买价值50美元的杂货。”
我正在尝试编写一个可以根据给定字符串解析“No”或“50”的正则表达式。
这就是我写的。
(?:(No) monthly maintenance|Purchase of \$([\d\.]+ worth groceries)
这样可以正常工作,但我希望我的输出只作为第一组/第1组。
答案 0 :(得分:1)
为什么不使用/(?:No monthly maintenance|Purchase of $([0-9.]+) worth groceries)/
。
如果匹配不是其中一种格式,则匹配将失败,并且组1匹配''
表示“无月维护”情况,或者其他情况下的数字匹配。
如果你真的需要捕获字符串No
或数字,你可能需要更复杂一些,并做一些类似的事情:
/(?:Purchase of $)?([0-9.]+|No) (?:monthly maintenance|worth groceries)/
答案 1 :(得分:1)
大多数语言按顺序对匹配组进行计数,无论它们是否在非捕获组((?:...|...)
)中,因此将有趣的部分强制转换为第一个捕获组可能比它的价值更麻烦。 / p>
根据您使用的语言,您可能希望尝试使用两个不同的预编译正则表达式并返回第一个匹配的匹配组,这样您就可以轻松地将有趣的部分放入第一个组中。
答案 2 :(得分: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语言。