用于在嵌套花括号之间匹配内容(函数/命名空间)的正则表达式
本文关键字:函数 命名空间 正则表达式 嵌套 之间 用于 | 更新日期: 2023-09-27 18:10:28
我在这里读了很多关于匹配和捕获文本中花括号之间字符串的主题,但没有找到答案,用于匹配和捕获函数的内容(特别是在内部有一些逻辑的情况下)。所以希望这个话题不会重复。
我需要匹配代码文件中的一些东西(我有很多,它们都有相似的结构,但深度不同),就像下面这个。
以下是我需要捕捉的内容:
-
主类名
-
子类名
-
子类函数名
-
各功能内容
我需要第一个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的扩展,有一些方法可以部分地(但不是一般地)处理这个问题。
在您的例子中,您有多达五层括号(不仅包括花括号,还包括普通括号)。无论如何,您的自动机(以及允许解析五个级别的正则表达式)将是复杂的。