我有一个具有多个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
有人可以帮忙吗?
答案 0 :(得分:2)
答案 1 :(得分:2)
答案 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 循环访问这些组。