string test = @"<'sfd<val1>sdf<val2>'><'sdkc'>fd'<val3>'sfd<val4>dfshjh<val5>fds";            Regex reg = new Regex(@"<val\d>");            MatchCollection mc = reg.Matches(test);            foreach (Match m in mc)
            {
                Console.WriteLine( m.Value);
                Console.WriteLine("-------------------------");            }            /* 
            上面输出:
             <val1>
            -------------------------
            <val2>
            -------------------------
            <val3>
            -------------------------
            <val4>
            -------------------------
            <val5>
            -------------------------
            
            我想加入以下限制,禁止匹配<''>内的<val数字>
            
            输出将为:
            <val3>
            -------------------------
            <val4>
            -------------------------
            <val5>
            -------------------------
            */我想匹配<val数字>的位置,但我想加入以下限制,禁止匹配<''>内的<val数字>,
不知道怎么写,那位前辈能搞定呢?谢谢!

解决方案 »

  1.   

    补充多一个 <'sfd<val1>sdf<val2>'><'sdkc'>fd'<val3>'sf<'skk<val4>dsdc' 'sdfd<val5>fc'>d<val6>dfshjh<val7>fds提取,<val3>,<val6>,<val7>
      

  2.   

    try...string test = @"<'sfd<val1>sdf<val2>'><'sdkc'>fd'<val3>'sfd<val4>dfshjh<val5>fds<'sfd<val1>s<val8>df<val2>'><'sdkc'>fd'<val3>'sf<'skk<val4>dsdc' 'sdfd<val5>fc'>d<val6>dfshjh<val7>fds";
    Regex reg = new Regex(@"(?is)(?<!<'((?!'>).)*)<val\d+>(?!((?!<').)*'>)");
    MatchCollection mc = reg.Matches(test);
    foreach (Match m in mc)
    {
        Console.WriteLine(m.Value);
        Console.WriteLine("-------------------------");
    }
      

  3.   

    过客太强了,能否改为只左边判断,例如:xxxxxx<val\d+>,不知道还能不能实现这个功能,左边预测字符
      

  4.   

    基本思路是增加限制,以<开头,以>结尾
    你试一试这样:
    Regex reg = new Regex("^<val\d>$");
    MatchCollection mc = reg.Matches(test);
      

  5.   


    左右两边都限制是为了严谨一点,如果格式基本就按你例子所给,那么只保留左边的判断倒也够了
    Regex reg = new Regex(@"(?is)(?<!<'((?!'>).)*)<val\d+>");