任意顺序的正则表达式捕获组

4
我需要从类似于这样的字符串中捕获属性值:
att_name1=value1|att_name2=value2|att_name3=value3

属性可以以任何顺序出现,约有50个属性。

我知道使用“lookarounds”可以匹配字符串。我编写了一个正则表达式,可以按特定顺序捕获值:

"^att1=(?<g1>\\w+)\\|att2=(?<g2>\\w+)\\|att3=(?<g3>\\w+)$"

有没有一种处理任何属性顺序的方法?

你关心属性名称吗?这部分 =(?\w+) 将选择所有的值。 - Eamonn McEvoy
编辑过。SO 隐藏了捕获组名称。 - optim1st
1个回答

7
你可以使用这个正则表达式:
\b(\w+)=(\w+)\b

捕获属性名称和值。匹配结果将保存在Groups[1].ValueGroups[2].Value中。

查看演示

样例正则表达式声明:

var rx = new Regex(@"\b(\w+)=(\w+)\b", RegexOptions.Compiled);

或者更好的方法是将其声明为调用方法外部的private static readonly字段。

如果您只想匹配已知属性及其相应值,请使用命名捕获组交替运算符

att_name1=(?<att_value1>\w+)|att_name2=(?<att_value2>\w+)|att_name3=(?<att_value3>\w+)

然后使用.Groups["att_value1"].Value等方式访问它们。在此处的演示中查看。


我是说要使用 (?<group_name>\w+) 而不是 (?\w+)。 - optim1st
1
抱歉,我忘记了 Stack Overflow 会从引用的文本中删除未标记的标签。 - Wiktor Stribiżew
@optim1st:不客气。那答案怎么样?对你有用吗? - Wiktor Stribiżew
我的错,我看了Match而不是Matches。是的,对我有效。谢谢! - optim1st
1
是的,您可以使用LINQ:var rx = new Regex(@"\b(\w+)=(\w+)\b", RegexOptions.Compiled); var resss = rx.Matches(str).Cast<Match>().Select(p => new { name = p.Groups[1].Value, value = p.Groups[2].Value }).ToList(); - Wiktor Stribiżew
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接