Match
类有一个name属性,但它始终是"0"
。
特别是
Regex.Matches("abcd", "b|d")
给出了两个只能通过值来区分的匹配项I。与替换品相同:
Regex.Replace("abcd", "b|d", m => m.Name) // gives a0b0
上面给出的是a0b0
,所以名称不会区分它们,Match
类中的其他内容也不会区分它们。
其他团体也无济于事,因为
Regex.Replace("abcdef", "(b)|(d)|(f)", m => m.Groups.Count.ToString())
给出a4c4e4
,因此在每个匹配评估中,所有组在匹配中都是相同的。
这意味着,虽然可以使用实际匹配的字符串,即值,但不可能知道它的任何其他信息,例如它与正则表达式中的哪个子模式匹配。
这需要用一个替换调用运行多个不同的替换,如果有很多替换模式,这可能比每个模式使用一个替换呼叫快得多。
这个悲伤的结论是正确的还是我遗漏了什么?
Regex.Replace("abcdef", "(b)|(d)|(f)", m => m.Groups.Values.Skip(1).First(g => g.Success).Name)
如果我正确理解你的问题,这将给你a1c2e3
,这可能是你想要的。
您需要跳过m.Groups[0]
,因为它对所有匹配都是相同的。m.Groups
包含原始正则表达式中的所有组,无论它们是否匹配。因此,您可以像上面的代码一样,通过成功筛选组。
使用此模式可以命名匹配的捕获组
(?<YourValueHere>.+)
然后作为提取
myMatch.Group["YourValueHere"].Value
当索引到匹配中可能有问题时,这就派上了用场,比如这个
((abc)|(def))? (GHI)
"GHI"捕获的匹配组索引是1还是2?为了避免该名称的匹配,如
((?<Name>abc)|(?<Rank>def))? (?<SerialNumber>GHI)
然后你可以检查/提取这样的
if (myMatch.Group["Rank"].IsSuccess)
rank = myMatch.Group["Rank"].Value
var SerialNumber = myMatch.Group["SerialNumber"].Value;