用于在嵌套花括号之间匹配内容(函数/命名空间)的正则表达式

本文关键字:函数 命名空间 正则表达式 嵌套 之间 用于 | 更新日期: 2023-09-27 18:10:28

我在这里读了很多关于匹配和捕获文本中花括号之间字符串的主题,但没有找到答案,用于匹配和捕获函数的内容(特别是在内部有一些逻辑的情况下)。所以希望这个话题不会重复。

我需要匹配代码文件中的一些东西(我有很多,它们都有相似的结构,但深度不同),就像下面这个。

以下是我需要捕捉的内容:

  1. 主类名

  2. 子类名

  3. 子类函数名

  4. 各功能内容

我需要第一个3扫描我们所有的项目,映射那些文件(和它们的功能)在哪里使用。

最后一个需要将其与可以在这些函数中使用的特定服务(内部和外部)列表进行匹配。

代码示例:

namespace Myprogramm.BusinessLogic
{
    public static class Utils
    {
        public static class Services
        {
            public static int GetSomeIDBySomeName()
            {
                // call some webservice
            }
            public static void UpdateViews()
            {
                // send some request
            }
            public static void IncreaseViews(int views)
            {
                if (views < 1000)
                {
                    // execute SQL SP1
                }
                else
                {
                    // execute SQL SP2
                }
            }
        }
        public static class SomeApi
        {
            public int OpenSomeSession(int someId)
            {
                if (someId < 0)
                {
                    // do something...
                }
                else
                {
                    // do something else ...
                }
            }
        }
    }
}

我要做的是,将这些文件作为文本读取,并将它们的内容与一些正则表达式相匹配,以捕获我需要的东西。

我是正则表达式的新手。所以我在这里并没有取得很大的成功。我不知道,我如何匹配和捕获子类的内容,然后我如何对函数做同样的事情。

我尝试使用这个(在另一个任务中)来捕获简单函数的内容(内部没有逻辑):

/{([^}]*)}/

与此(也在另一个任务中获取主类/命名空间的内容):

/{(['s'S]*)}/

我明白,为什么这对我的任务没有帮助。

要清楚,首先我需要捕获这个(获得主类名)和它的内容:

public static class Utils {...}

***这个我其实懂

然后是这两个(捕获子类名称和它们的内容):

1。

public static class Services {...}

2。

public static class SomeApi {...}

然后(仅以第一个子类为例):

1。

public static int GetSomeIDBySomeName() {...}

2。

public static void UpdateViews() {...}

3。

public static void IncreaseViews(int views) { if (views < 1000) {...} else {...} }

用于在嵌套花括号之间匹配内容(函数/命名空间)的正则表达式

在Jeffrey Friedl的《Mastering Regular Expressions》一书中,第436页有一个合适的示例。
如何匹配嵌套结构也在regular-expressions.info或weblogs.asp.net中解释。

将源代码中的示例更改为大括号将导致如下内容:

{(?>[^{}]+|{(?<x>)|}(?<-x>))*(?(x)(?!))}

其中x对应嵌套深度。测试它在regexhero.net

  • (?>打开原子组
  • [^{}]匹配一个字符,不是大括号
  • {(?<x>)对深度的影响
  • }(?<-x>)减去深度/堆栈
  • (?(x)(?!))确保在满足最终}之前深度为零

Reference - this regex是什么意思

一般来说,嵌套的something语言与正则表达式定义的语言(正则语言)属于不同的类别(上下文无关语言)。常规语言具有不允许嵌套的语法,并且可以使用确定性或非确定性有限状态自动机进行有效解析。上下文无关的语言至少需要一个基于堆栈的自动机,它允许在某种程度上在某些地方存储括号的级别(在本例中堆栈)为了能够用regexp解析嵌套括号表达式,您需要首先转换这些语言,使它们看起来几乎像上下文无关的语言,但事实并非如此。只要给你的语言可以解析的圆括号加上一个上限,你就会得到一个规则的语言。只有这样,您才能将上下文无关的语言转换为常规语言。

通过一些语言(如perl或python)对regexp的扩展,有一些方法可以部分地(但不是一般地)处理这个问题。

在您的例子中,您有多达五层括号(不仅包括花括号,还包括普通括号)。无论如何,您的自动机(以及允许解析五个级别的正则表达式)将是复杂的。