.NET Regex 的 Match 类:匹配名称是什么?



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;

相关内容

  • 没有找到相关文章

最新更新