繁体   English   中英

正则表达式,用于在嵌套花括号之间匹配内容(功能/名称空间)

[英]Regex for matching content (function/namespace) between nested curly braces

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

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

这是我需要捕捉的东西:

  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.infoweblogs.asp.net

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

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

其中x对应于嵌套深度。 regexhero.net上进行测试

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

参考-此正则表达式是什么意思

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

随着某些语言(例如perl或python)对regexp的扩展,有一些方法可以部分地(但不是一般性地)解决这个问题。

在您的情况下,您最多有五个级别的括号(不仅包括大括号,而且还包括普通括号)。 无论如何,您的自动机(以及允许解析五个级别的正则表达式)将很复杂。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM