重复命名的捕获组

时间:2010-12-12 23:04:18

标签: regex

我有一个包含如下字段的字符串:id =“ID-120-1,ID-141-5,ID-92-5,N / A”

我只想捕获指定捕获组的“ID”(即没有“N / A”或其他可能进入的项目)。我认为这可行,但没有运气:

\bid=\"(?<id>(ID-\d+-\d+)+)

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您正在使用的表达式只返回一个,因为您指望在每个ID值前面出现的id的开头。以下调整应该解决这个问题。

(?:(?:=\")|(?:,\s))(?<id>(?:ID-\d+-\d+)*)

另一种选择是放弃id =“检查所有部分

(?<id>(?:ID-\d+-\d+))

或者您可以在ID的末尾添加“,”,以确保您处于属性中。

(?<id>(?:ID-\d+-\d+))(?:(?:,\s)|(?:"))

答案 1 :(得分:0)

您还需要捕获逗号和空格,因为它们在您的字符串中重复:

\bid=\"(?<id>(ID-\d+-\d+, )+)

答案 2 :(得分:0)

我相信纯正的正则表达式无法实现您的目标,特别是如果ID和'N / A'可以混合使用。您需要在程序中使用循环,或者如果使用Perl或PHP,则可以在正则表达式(/e开关)的替换部分中运行代码,以将匹配项添加到数组中。