【问题标题】:Use RegEx to extract specific part from string使用 RegEx 从字符串中提取特定部分
【发布时间】:2021-09-20 12:12:42
【问题描述】:

我有类似的字符串

"Augustin Ralf (050288)"
"45 Max Müller (4563)"
"Hans (Adam) Meider (056754)"

我正在寻找一个正则表达式来提取括号中的最后一部分,例如上面字符串的结果:

"050288"
"4563"
"056754"

我试过了

 var match = Regex.Match(string, @".*(\(\d*\))");

但我也得到了结果的括号。有没有办法提取字符串并在没有括号的情况下获取它?

【问题讨论】:

  • 请使用正则表达式 - (([^)]*))[^(]*$。这按预期工作。我已经测试了here
  • 记得接受对你有帮助的答案(如果你愿意,还可以投票给其他人)。

标签: c# regex


【解决方案1】:

准确把握您的要求,您正在寻找

\(([^()]+)\)$

这将捕获括号之间的任何内容(不是嵌套!),可能是数字或其他任何内容,并将它们锚定到字符串的末尾。如果最后碰巧有空格,请使用

\(([^()]+)\)\s*$

C# 这可能是

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"\(([^()]+)\)$";
        string input = @"Augustin Ralf (050288)
45 Max Müller (4563)
Hans (Adam) Meider (056754)
";
        RegexOptions options = RegexOptions.Multiline;
        
        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

a demo on regex101.com

【讨论】:

  • 谢谢。但是我必须从匹配的值中手动删除括号吗?
  • 不,使用第一个捕获组。
  • 我必须使用第二个捕获组。首先是比赛本身。
  • @BennoDual:好的。老实说,我不太喜欢C#。很高兴,它对你有用。
【解决方案2】:

请使用正则表达式 - \(([^)]*)\)[^(]*$。这按预期工作。我已经测试过here

【讨论】:

    【解决方案3】:

    您可以提取括号之间的数字,而无需担心使用以下正则表达式提取捕获组。

    (?<=\()\d+(?=\)$)
    

    demo

    解释:

    (?&lt;=\() :正向寻找( 意味着匹配将在( 之后开始,而不会将其捕获到结果中。

    \d+:连续捕获所有数字,直到找到非数字字符

    编辑:如果数字可以在不在行尾的括号内,请从正则表达式中删除 $ 以修复匹配。

    【讨论】:

    • 虽然这是真的,但环视是“昂贵的”,并且当字符串更长时会花费更长的时间。
    【解决方案4】:
     var match = Regex.Match(string, @".*\((\d*)\)");
    

    https://regex101.com/r/Wk9asY/1

    【讨论】:

      【解决方案5】:

      这里有三个选项供您选择。

      第一个使用最简单的模式,另外还有 Trim 方法。

      第二个使用捕获所需的值到组,然后从组中获取它。

      第三个使用 Lookbehind 和 Lookahead。

      var inputs = new string[] {
          "Augustin Ralf (050288)", "45 Max Müller (4563)", "Hans (Adam) Meider (056754)"
      };
      
      
      foreach (var input in inputs)
      {
          var match = Regex.Match(input, @"\(\d+\)");
          Console.WriteLine(match.Value.Trim('(', ')'));
      }
      Console.WriteLine();
      
      
      foreach (var input in inputs)
      {
          var match = Regex.Match(input, @"\((\d+)\)");
          Console.WriteLine(match.Groups[1]);
      }
      Console.WriteLine();
      
      
      foreach (var input in inputs)
      {
          var match = Regex.Match(input, @"(?<=\()\d+(?=\))");
          Console.WriteLine(match.Value);
      }
      Console.WriteLine();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多