我有一个这样的问题:
判定表达式的类型,类型分为下面几种类型
A&B , A>B, A|B例如给出如下的表达式:(P(X014,X016,AC5)&(HSB(X013,X014)|(HRB(X015,X016)))>P(X013,X015,AC1)用正则表达式能判定出是那种类型的吗,怎么写?谢谢!!!

解决方案 »

  1.   

    还有,判断出来后,取出相应的A和B的值?
    这个表达式判断结果应该是为A>B类型的.
      

  2.   

    using System;
    using System.Text.RegularExpressions;
    class MainClass
    {    static void Main()
        {
            string inStr = @"(P(X014,X016,AC5)&(HSB(X013,X014)|(HRB(X015,X016)))>P(X013,X015,AC1)";
            Regex myReg = new Regex(@"(?<num1>(.*))(?<op>[>|&])(?<num2>(.*))");
            Match m = myReg.Match(inStr);
            string op = m.Groups["op"].Value;
            string num1 = m.Groups["num1"].Value;
            string num2 = m.Groups["num2"].Value;
            Console.WriteLine(op);
            Console.WriteLine(num1);
            Console.WriteLine(num2);
            Console.ReadLine();
        }
    }
      

  3.   

    (?<name>) 将匹配的子字符串捕获到一个组名称或编号名称中。用于name的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号,例如(?'name')。
    (?<name>)的分组方式,,就是对分组的部分进行了命名,这样就可以通过该组的命名来获取信息;
      

  4.   

    (?<num1>(.*))
    构造一个名为num1的分组,匹配0个或多个所有的字符
      

  5.   

    谢谢 shrinerain(圣影雨) 与 dazhu2(边城浪子【倚天不出,谁与争锋】) 我把表达式这样写
    P(X013,X015,AC1)>(P(X014,X016,AC5)&(HSB(X013,X014)|(HRB(X015,X016)))
    用上面的方法得到的是
    num1 = P(X013,X015,AC1)>(P(X014,X016,AC5)&(HSB(X013,X014)
    num2 = (HRB(X015,X016)))
    op = |
    这样是不对的啊,看来上面的方法还是有点问题,继续请教
      

  6.   

    因为 .* 默认匹配尽可能多的字符,而且 shrinerain 的方案没有注意空格的存在,所以不是正解。稍等我研究正解出来吧。
      

  7.   

    using System;
    using System.Text.RegularExpressions;
    class MainClass
    {    static void Main()
        {
            string inStr = @"P(X013,X015,AC1)>(P(X014,X016,AC5)&(HSB(X013,X014)|(HRB(X015,X016))))";
            PrintExtraction(inStr, 0);
            Console.ReadLine();
        }    static void PrintExtraction(string expression, int level)
        {
            string indent = new string(' ', level);
            string num1, op, num2;
            if (Extract(expression, out num1, out op, out num2))
            {
                if (op == string.Empty)
                {
                    Console.WriteLine(indent + num1);
                }
                else
                {
                    PrintExtraction(num1, level + 1);
                    Console.WriteLine(indent + op);
                    PrintExtraction(num2, level + 1);
                }
            }
            else
            {
                Console.WriteLine(indent + "Cannot Match!!");
            }
        }    static bool Extract(string expression, out string num1, out string op, out string num2)
        {
            num1 = op = num2 = string.Empty;
            Regex regex = new Regex(@"
    ^
    (?<lead>\()*
    (?<num1>
        [^>|&(]*?
        (
            (
                (?<open>\()
                [^()]*
            )+
            (
                (?<-open>\))
                [^()]*?
            )+
        )*
        (?(open)(?!))
    )
    (
        (?<op>[>|&])
        (?<num2>
            [^(]*
            (
                (
                    (?<open>\()
                    [^()]*
                )+
                (
                    (?<-open>\))
                    [^()]*
                )+
            )*
            (?(open)(?!))
        )
    )?
    (?<-lead>\))*
    (?(lead)(?!))
    $
    ", RegexOptions.IgnorePatternWhitespace | RegexOptions.ExplicitCapture);
            Match match = regex.Match(expression);
            if (match.Success)
            {
                num1 = match.Groups["num1"].Value;
                if (match.Groups["op"].Success)
                {
                    op = match.Groups["op"].Value;
                    num2 = match.Groups["num2"].Value;
                }
                return true;
            }
            else
            {
                return false;
            }
        }
    }那个正则表达式我就懒得加注释了,可参考: http://community.csdn.net/Expert/TopicView.asp?id=4484337PrintExtraction 是个递归方法,一直解构表达式到不能结构为止。Extract 是真正的正则测试方法,如果成功则返回true,不成功则返回false当返回true的时候,输出参数num1, op, num2包含解构之后的左操作数、操作符、右操作数。如果当前表达式是独立表达式,则 op = num2 = 空。此外——你上面的回复那个表达式最后漏了个右括号,害我调试了良久
      

  8.   

    多说一句,num1和num2仍然可以为空,而且我不会用正则内部的方法简单的控制它们的长度,但是在外面测试num1和num2的长度仍然是很简单的,所以这个我就不理了。
      

  9.   

    正则第4行:
        [^>|&(]*?
    问号可以去掉。
      

  10.   

    楼主非得用正则么?using System;
    using System.Collections;
    class MainClass
    {    static void Main()
        {
            string inStr = "P(X013, X015, AC1) > (P(X014, X016, AC5) & (HSB(X013, X014) | (HRB(X015, X016))));";
            inStr = inStr.Replace(" ", "");
            int pos = 0;
            int opPos = 0;
            bool flag = false;
            Stack bras = new Stack();
            while (true)
            {
                if (inStr[pos] == '(')
                {
                    bras.Push('(');
                    flag = true;
                }
                if (inStr[pos] == ')')
                {
                    bras.Pop();
                }
                pos++;
                if (flag && bras.Count == 0)
                {
                    opPos = pos;
                    break;
                }        }
            string op = inStr[opPos].ToString();
            string num1 = inStr.Substring(0, opPos);
            string num2 = inStr.Substring(opPos+1, inStr.Length - opPos-1);
            Console.WriteLine(op);
            Console.WriteLine(num1);
            Console.WriteLine(num2);
            Console.ReadLine();
        }
    }
      

  11.   

    To: netmicro 不好意思啊,我再请教一下:
    如下的表达式
    string inStr = @"(P(X013,X015,AC1)>P(X014,X016,AC5))&(HSB(X013,X014)|HRB(X015,X016))";想得到的输出结果是&类型的,
    现在输出的不是,我正在看你的代码,你有空的话看看是怎么回事?多谢
      

  12.   

    thanks to shrinerain
    我想用正则表达式应该方便一些吧,具体的我对正则表达式还不了解,不知道这样是不是能很方便的解决,
    我想问一下,正则表达式中有没有嵌套的用法,因为我要解决的也就是表达式嵌套的问题,
    例如如下:
    string inStr = @"(P(X013,X015,AC1)>P(X014,X016,AC5))&(HSB(X013,X014)|HRB(X015,X016))";
    应该输出为&类型,我不知道用正则表达式能解决类似的问题吗?
      

  13.   

    to 楼上:
    string inStr = @"(P(X013,X015,AC1)>P(X014,X016,AC5))&(HSB(X013,X014)|HRB(X015,X016))";用我那会发的非正则程序可以得到正确结果由于你的要求是要括号配对,我觉得非正则方式,比如我用stack还清楚简单一些。
      

  14.   

    thanks to shrinerain看来用正则是比较麻烦的了,我运行了你的代码,是可以的,多谢!
    这种方式还是挺简便易懂的.感谢各位的帮助,结贴.