Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当您有树模式时,正则表达式不能按预期工作_C#_.net_Regex - Fatal编程技术网

C# 当您有树模式时,正则表达式不能按预期工作

C# 当您有树模式时,正则表达式不能按预期工作,c#,.net,regex,C#,.net,Regex,我有一个正则表达式: ^(?'IF'[IF\s]{3})(?'CONDICTION'[\w\s\d+=/\.\*-><\(\)]+)(?'THEN'THEN)(?'TRUE'[\w\s\d+=/\.\*-><\(\)]*)(?'ELSE'[\s\w]ELSE[\s|\n])(?<FALSE>[\w\s\d.+\-*/]*)(?<ENDIF>([\s\nENDIF]{6})) 工作很好,我得到了以下信息: IF: IF CONDICTION: 1

我有一个正则表达式:

^(?'IF'[IF\s]{3})(?'CONDICTION'[\w\s\d+=/\.\*-><\(\)]+)(?'THEN'THEN)(?'TRUE'[\w\s\d+=/\.\*-><\(\)]*)(?'ELSE'[\s\w]ELSE[\s|\n])(?<FALSE>[\w\s\d.+\-*/]*)(?<ENDIF>([\s\nENDIF]{6}))
工作很好,我得到了以下信息:

IF: IF
CONDICTION: 1 = 1 
THEN: THEN
TRUE: 1
ELSE: ELSE 
FALSE: 3
ENDIF: ENDIF
IF: IF 
CONDICTION: 1 = 1 THEN 1 ELSE IF 1 = 2 
THEN: THEN
TRUE:  3
ELSE:  ELSE 
FALSE: 2 ENDIF
ENDIF:  ENDIF
但如果我尝试这个表达:

IF 1 = 1 THEN 1 ELSE IF 1 = 2 THEN 3 ELSE 2 ENDIF ENDIF
我得到了以下信息:

IF: IF
CONDICTION: 1 = 1 
THEN: THEN
TRUE: 1
ELSE: ELSE 
FALSE: 3
ENDIF: ENDIF
IF: IF 
CONDICTION: 1 = 1 THEN 1 ELSE IF 1 = 2 
THEN: THEN
TRUE:  3
ELSE:  ELSE 
FALSE: 2 ENDIF
ENDIF:  ENDIF
但我想要这个:

IF: IF 
CONDICTION: 1 = 1
THEN: THEN
TRUE:  1
ELSE:  ELSE 
FALSE: IF 1 = 2 THEN 3 ELSE 2 ENDIF
ENDIF:  ENDIF

我需要什么正则表达式来匹配这一点?

您似乎在正确的轨道上。您已经定义了语法,因此需要对表达式进行标记,并根据语法对其进行解析。换句话说,您需要为您的特定需求编写解析器

一些有用的链接:


我使用


我会在博客中解释细节,并编辑这个答案

它不适用于“树模式”,因为这需要一个实际的语法分析树,而正则表达式从来就不需要这样做。你想要的是一个解析器,而不是正则表达式。克里斯是对的。正则表达式之所以被称为正则表达式,是因为它们最擅长匹配“正则”语言。您正在尝试匹配“上下文无关”语言,而不是“常规”语言。为自己构建一个与该语言相匹配的递归下降解析器。我会使用反讽作为我的语法,但我想使用正则表达式来解决这个问题。首先:好好想想
[IF\s]{3}
[\s\nENDIF]{6}
-我肯定你没有写下你的意思(顺便问一下,
FFF
是一个有效的条件吗?只是问一下…)接下来,.Net正则表达式可以解析您的语言,但它可能会变得有些复杂。考虑几点:1。可能包含类似于条件2的单词的字符串文本。评论3。可选的
ELSE
子句。如果你真的准备好解决所有这些问题,你可以考虑平衡小组。(我以后可能会试一试)只有FFF不是一个有效的条件,但还有另一个人知道这一点。FFF>3是一个有效条件