我有一个正则表达式来查找单个if-then-else条件。
string pattern2 = @"if( *.*? *)then( *.*? *)(?:else( *.*? *))?endif";
现在,我需要扩展这个&如果条件提供循环。但正则表达式不适合提取当时&其他部分正确。
示例循环IF条件:
if(2> 1)then(if(3> 2)then(if(4> 3)then then 4 else 3 endif)else 2 endif)else 1 endif
正则表达式的预期结果:
条件=(2> 1) 然后part =(if(3> 2)then(if(4> 3)then then 4 else 3 endif)else 2 endif) 别的部分= 1
我可以查看是否还有&然后部分有真实的价值或条件。然后我可以在这个内部条件上使用相同的正则表达式,直到一切都解决了。
当前正则表达式返回的结果如下:
条件=(2> 1) 然后part =(if(3> 2)then(if(4> 3)then3) 别的部分= 3
意思是,它在找到第一个“else”后返回值。但实际上,它必须从最后的其他内容中提取。
有人可以帮我这个吗?
答案 0 :(得分:5)
您可以根据回答Can regular expressions be used to match nested patterns?(http://retkomma.wordpress.com/2007/10/30/nested-regular-expressions-explained/)调整解决方案。
该解决方案显示了如何匹配html标记之间的内容,即使它包含嵌套标记。对括号对应用相同的想法应该可以解决您的问题。
编辑:
using System;
using System.Text.RegularExpressions;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
String matchParenthesis = @"
(?# line 01) \((
(?# line 02) (?>
(?# line 03) \( (?<DEPTH>)
(?# line 04) |
(?# line 05) \) (?<-DEPTH>)
(?# line 06) |
(?# line 07) .?
(?# line 08) )*
(?# line 09) (?(DEPTH)(?!))
(?# line 10) )\)
";
//string source = "if (2 > 1) then ( if(3>2) then ( if(4>3) then 4 else 3 endif ) else 2 endif) else 1 endif";
string source = "if (2 > 1) then 2 else ( if(3>2) then ( if(4>3) then 4 else 3 endif ) else 2 endif) endif";
string pattern = @"if\s*(?<condition>(?:[^(]*|" + matchParenthesis + @"))\s*";
pattern += @"then\s*(?<then_part>(?:[^(]*|" + matchParenthesis + @"))\s*";
pattern += @"else\s*(?<else_part>(?:[^(]*|" + matchParenthesis + @"))\s*endif";
Match match = Regex.Match(source, pattern,
RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase);
Console.WriteLine(match.Success.ToString());
Console.WriteLine("source: " + source );
Console.WriteLine("condition = " + match.Groups["condition"]);
Console.WriteLine("then part = " + match.Groups["then_part"]);
Console.WriteLine("else part = " + match.Groups["else_part"]);
}
}
}
答案 1 :(得分:1)
如果您将endif
替换为end
,则
if (2 > 1) then ( if(3>2) then ( if(4>3) then 4 else 3 end) else 2 end) else 1 end
你也得到了一个完美的Ruby表达式。 Download IronRuby并将对IronRuby,IronRuby.Libraries和Microsoft.Scripting的引用添加到您的项目中。您可以在C:\Program Files\IronRuby 1.0v4\bin
然后
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;
using IronRuby;
并在您的代码中
var engine = Ruby.CreateEngine();
int result = engine.Execute("if (2 > 1) then ( if(3>2) then ( if(4>3) then 4 else 3 end ) else 2 end) else 1 end");