使用加号作为分隔符时,正面看后方和前瞻失败

时间:2012-01-06 10:55:09

标签: .net regex

我有以下字符串:

city-Rio de Janeiro + Sao Paulo + Belo Horizo​​nte

我正在使用以下正则表达式尝试捕获城市名称:

(?<=city\-|\+)(?<city>[a-zA-Z\s+\-]+)(?=\+|$)
不幸的是,上面的正则表达式正在回归一个大集团,如下:

里约热内卢+圣保罗+贝洛奥里藏特

如果我更改源字符串和正则表达式中的分隔符,一切正常,但我想使用加号作为分隔符,我该怎么做?

1 个答案:

答案 0 :(得分:2)

匹配那么多,因为字符类中的+(方括号)与文字'+'匹配。删除它:

(?<=city-|\+)(?<city>[a-zA-Z\s-]+)(?=\+|$)

你会得到3场比赛:

  1. Rio de Janeiro
  2. Sao Paulo
  3. Belo Horizonte
  4. 如下面的测试证明:

    enter image description here

    使用Ideone进行小型C#测试:

    using System;
    using System.Text.RegularExpressions;
    
    class Example 
    {
       static void Main() 
       {
          string text = "city-Rio de Janeiro+Sao Paulo+Belo Horizonte";
          string pat = @"(?<=city-|\+)(?<city>[a-zA-Z\s-]+)(?=\+|$)";
    
          Regex r = new Regex(pat);
          Match m = r.Match(text);
    
          while (m.Success) 
          {
             Console.WriteLine("found: '" + m.Groups[1] + "'");
             m = m.NextMatch();
          }
       }
    }
    

    产生了以下输出:

    found: 'Rio de Janeiro'
    found: 'Sao Paulo'
    found: 'Belo Horizonte'

    另请注意,在课程结束时,在字符类之外,-不需要转义。