正则表达式找到内部if条件

时间:2011-09-29 11:47:20

标签: c# regex

我有一个正则表达式来查找单个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”后返回值。但实际上,它必须从最后的其他内容中提取。

有人可以帮我这个吗?

2 个答案:

答案 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");