【问题标题】:Count number of groups in the regex pattern计算正则表达式模式中的组数
【发布时间】:2013-09-21 11:07:01
【问题描述】:

我正在使用这段代码来计算一个正则表达式模式包含多少组。

Dim GroupCount As Integer = Regex.Match(input, pattern).Groups.Count

当模式匹配输入时返回成功:

Dim GroupCount As Integer = Regex.Match(" something ", "( )something( )").Groups.Count 

但如果模式不匹配,它总是返回 1。

Dim GroupCount As Integer = Regex.Match("ABC", "( )something( )").Groups.Count 

无论如何,我需要一个计算模式中组数的函数

【问题讨论】:

  • 这是什么意思? open bracket "(...)"
  • @monocular 我很想知道你用来匹配的“模式”。
  • @HamletHakobyan 我的意思是我想计算一个正则表达式模式包含多少组。例如,此模式有 3 个组: (([a-z])([1-9]))
  • \( 有意义吗?你必须得到匹配的数量。
  • @HamletHakobyan 您的意思是将正则表达式 \( 应用于 OP 的模式吗?这不考虑字符类中转义的(( 或模式中的各种非捕获组。

标签: .net regex vb.net


【解决方案1】:

Regex.GetGroupNumbers()怎么样?

Dim pattern As New Regex("( )something( )")
Dim groupCount As Integer = pattern.GetGroupNumbers().Length

通过从Regex 对象获取结果,它独立于任何特定匹配,这正是您想要的。

您可能希望从结果中减去 1,因为整个字符串也是一个组(位于索引 0),具体取决于您要查找的内容。

Demo.

【讨论】:

  • 既然这意味着创建一个 RegEx 实例,难道没有内存/性能成本吗?是否有任何静态方法可以使用与 RegEx 中的其他静态函数相同的缓存?
【解决方案2】:

如果我的理解正确,那么您需要计算任何单词中的 ( ) 实例。如果我是正确的,那么这应该对您有所帮助;

Dim s As String = "( )yourstring()somevalue( )getit()"
            'A sample string.
Dim rgx As New Regex("(?<BraceGroup>\([ ]*\))", RegexOptions.Singleline)
            'Regex pattern to match '( )' or '()'.
Dim matches As MatchCollection = rgx.Matches(s)
            'Get all matches.
Dim count As Integer = matches.Count
            'Number of matches.
Console.WriteLine(String.Format("Total '() captures' found : {0}", count))

Ideone 演示 here.

【讨论】:

  • 嗯,正则表达式的方法和行为在 VB.NET 中都是一样的(毕竟它们都只使用 .NET 类)。对于这个例子,实际上只是语法不同的声明和构造函数。
【解决方案3】:

Read the manual:

返回值 类型:System.Text.RegularExpressions.Match 包含匹配信息的对象。

您需要测试 GroupCount.Success。

【讨论】:

  • OP 提到他知道如果匹配失败,它将返回一个 Count 1。这个答案没有回答即使没有匹配项也要让组计数的主要问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
相关资源
最近更新 更多