C# 用于匹配编程语言(如块)的正则表达式
我正在尝试用c语言编写一个小型脚本语言# 当前正在执行块解析器 我一直在为block制作正则表达式。 积木可以有∞ 子块的时间 这就是我需要抓住的C# 用于匹配编程语言(如块)的正则表达式,c#,regex,C#,Regex,我正在尝试用c语言编写一个小型脚本语言# 当前正在执行块解析器 我一直在为block制作正则表达式。 积木可以有∞ 子块的时间 这就是我需要抓住的 { naber(); } { int x = 5; x = 2; if (x == 5) { x = 5; } } 我试过了,但没有成功 \{[^{}]*|(\{[^\{\}]\})*\} 这是我的第一篇帖子,请宽恕我吧Regex不会帮你的。如果您正在设计一种可能要执行的脚本语言,它具
{
naber();
}
{
int x = 5;
x = 2;
if (x == 5) {
x = 5;
}
}
我试过了,但没有成功
\{[^{}]*|(\{[^\{\}]\})*\}
这是我的第一篇帖子,请宽恕我吧Regex不会帮你的。如果您正在设计一种可能要执行的脚本语言,它具有块和子块,那么您需要使用正则表达式来表示 要解释上下文无关语言,需要以下步骤(简化):
这些应该已经有很多概念可供搜索,但所有这些都可以通过类似的工具轻松实现。很明显,ANTLR可能还有其他替代方法,我现在不记得了。我同意有人说,regex不是您应该使用的解析代码。 也就是说,在某些注册引擎上,可以匹配字符并在块中获取代码 这可能适合您
{((?>[^{}]+|(?R))*)}
。如果正则表达式引擎支持递归模式,那么就可以对代码进行解析
这里有更多关于它的信息为什么要使用正则表达式而不是用类似的东西来编写实际的解析器?不幸的是,编程语言(至少是您尝试创建的类型)不是正则的,因此您无法用正则表达式来解析它们。在某个时刻,你会遇到麻烦,必须使用或编写一个真正的解析器,你不能有一个正则表达式。如果您在Linux中这样做,我建议您使用YACC(另一个编译器),它使用LEX(类似于REGEX)作为表达式。你的表达式是1)“intx=5”2)“x=2”3)x==5 4)x=5 5)如果()编译器你必须定义你的语言和表达式。你不能在一个结构中同时做这两件事。OP缺少语言语法。如果
{(?>[^{}]+|(?){{124;(?)})*}
解决了“语言”的问题,那么就使用它。如果{
和}
可以出现在函数/方法体定界符以外的任何上下文中,则不能依赖平衡结构,必须编写解析器。