【问题标题】:Returning only part of match from Regular Expression从正则表达式仅返回部分匹配项
【发布时间】:2010-10-12 07:54:03
【问题描述】:

假设我的字符串“用户名:firstname.surname”包含在一个较大的字符串中,如何使用正则表达式来获取 firstname.surname 部分?

我尝试过的每个方法都返回字符串“用户名:firstname.surname”,然后我必须将“用户名:”上的字符串替换为空字符串。

这里可以使用反向引用吗?

编辑:

较长的字符串可能包含“帐户名:firstname.surname”,因此我还想匹配字符串的“用户名:”部分以获得该值。

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    我喜欢使用命名组:

    Match m = Regex.Match("User Name:first.sur", @"User Name:(?<name>\w+\.\w+)");
    if(m.Success)
    {
       string name = m.Groups["name"].Value;
    }
    

    ?&lt;something&gt; 放在括号中的组的开头(例如(?&lt;something&gt;...))允许您使用something 作为键(例如来自m.Groups["something"].Value)从匹配中获取值

    如果你不想麻烦给你的组命名,你可以说

    Match m = Regex.Match("User Name:first.sur", @"User Name:(\w+\.\w+)");
    if(m.Success)
    {
       string name = m.Groups[1].Value;
    }
    

    然后得到第一个匹配的东西。 (请注意,第一个带括号的组位于索引 1;匹配的整个表达式位于索引 0

    【讨论】:

      【解决方案2】:

      您也可以尝试“环视”的概念。这是一种零宽度断言,意味着它会匹配字符,但不会在结果中捕获它们。

      在您的情况下,我们可以积极地向后看:我们希望目标字符串“firstname.surname”后面的内容等于“用户名:”。

      正向后视运算符:(?

      这可以这样实现,例如(一个小的 Java 示例,使用字符串替换):

      String test = "Account Name: firstname.surname; User Name:firstname.surname";
      String regex = "(?<=User Name:)firstname.surname";
      String replacement = "James.Bond";
      System.out.println(test.replaceAll(regex, replacement));
      

      这仅替换“用户名:”前面的“名字.姓氏”字符串,而不替换“用户名:”本身 - 正则表达式不返回,仅匹配。

      输出:帐户名称:firstname.surname;用户名:James.Bond

      也就是说,如果您使用的语言支持这种操作

      【讨论】:

      【解决方案3】:

      用括号创建一个组,然后从Match.Groups 集合中获取它,如下所示:

      string s = "User Name:firstname.surname";
      Regex re = new Regex(@"User Name:(.*\..*)");
      Match match = re.Match(s);
      if (match.Success)
      {
          MessageBox.Show(match.Groups[1].Value);
      }
      

      (注意:第一组,索引为0,是整个匹配)

      【讨论】:

        【解决方案4】:

        我使用过的所有正则表达式库都允许您使用括号在正则表达式中定义组,然后从结果中访问该组。

        因此,您的正则表达式可能如下所示:用户名:([^.].[^.])

        完全匹配的是第 0 组。括号内匹配的部分是第 1 组。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多