RegEx用于多行语句

时间:2014-08-25 12:23:02

标签: c# regex

我有一个具有多个IF条件的文件。 我需要在数据库中保存这些IF条件以构建逻辑树。

所有IF条件语句都具有相同的格式。所以,我想建立一个可以提取这个的RegEx。

IF条件具有以下格式

IF CONDITION THEN
    Variable1:=Value1 Variable2:=Value2 RETURN TRUE
ENDIF     

IF CONDITION THEN
    Variable1:=Value1 Variable2:=Value2 RETURN TRUE
ENDIF     

等等

CONDITION可以有多个AND,OR,NOT,()子句。但写在一行。

我希望正则表达式返回以下内容 1.条件 2. Variable1:= Value1 3.变量2:=值2

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

假设格式严格按照您的说法进行:

IF (.+?) THEN\R\s+(.+:=.+) (.+:=.+)\s+RETURN TRUE\RENDIF

Demo

答案 1 :(得分:2)

您可以使用此正则表达式:

IF\s(.+?)\sTHEN\n\s+(.+?:=.+?)\s(.+?:=.+?)\s

第1,2,3组分别包含你想要的东西。

DEMO

答案 2 :(得分:2)

以下代码应该做你想要的。

如果您愿意,可以使用 for 循环,或将计数器添加到 foreach 循环(在这种情况下,我认为更容易阅读)。我用来访问命名组的代码只是一个示例,您必须修改它才能获得所需的结果。

通过以下方式,您可以解析有错误的输入文本(例如,您不期望它们的新行或小写字母),并且无论如何都会识别这些值。

如果你确定输入文本的结构是不变的,你可以在某些情况下改变模式中的'\ s +'(意思是:至少一个空白字符)到一个空间。

string s =
    @"aaa s
    IF CONDITION1 AND 
CONDITION2 or(cond2 and not cond4) THEN
        Variable1:=Value1 Variable2:=Value2 RETURN TRUE
    ENDIF     

    IF CONDITION THEN
        Variable1:=Value1 Variable2:=Value2 Variable3:=Value3 RETURN TRUE
    ENDIF     
    fdskjh fff";
Regex rrr = new Regex(@"^if\s+(?<Condition>[0-9a-z_\s\(\)]+)then\s+((?<Action>[0-9a-z_]+:=[0-9a-z_]+)\s+)+return\s+true\s+endif", 
                RegexOptions.Multiline | RegexOptions.IgnoreCase);

var matches = rrr.Matches(s);
foreach (Match match in matches)
{
    Console.WriteLine("Condition: " + match.Groups["Condition"].Value);
    foreach (Capture capture in match.Groups["Action"].Captures)
    {
        Console.WriteLine("   Action: "+ capture.Value);
    }
}

<强>结果:

Condition: CONDITION1 AND 
CONDITION2 or(cond2 and not cond4) 
   Action: Variable1:=Value1
   Action: Variable2:=Value2
Condition: CONDITION 
   Action: Variable1:=Value1
   Action: Variable2:=Value2
   Action: Variable3:=Value3

<强>解释

RegexOptions.Multiline - 使用此选项时,'^'表示开始新行(否则它是整个文本的开头)

RegexOptions.IgnoreCase - 使用它,这样您就不必担心小写或大写字母,它使正则表达式更简单。如果您希望它区分小写和大写字母,则必须删除此选项并相应地修改模式。

现在,模式本身:

^if\s+(?<Condition>[0-9a-z_\s\(\)]+)then\s+((?<Action>[0-9a-z_]+:=[0-9a-z_]+)\s+)+return\s+true\s+endif

它使用命名组,例如:

(?<Condition>[0-9a-z_\s\(\)]+) - 一个名为'条件'的群组

(?<Action>[0-9a-z_]+:=[0-9a-z_]+) - 一个名为'Action'的组,可以重复,并且在另一个组内(未命名) )。这样,“动作”的数量不必是恒定的。

稍后 foreach 循环访问这些组。

相关问题