使用 RegEx 从字符串中提取特定部分

Posted

技术标签:

【中文标题】使用 RegEx 从字符串中提取特定部分【英文标题】:Use RegEx to extract specific part from string 【发布时间】: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 记得接受对你有帮助的答案(如果你愿意,还可以投票给其他人)。 【参考方案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();

【讨论】:

以上是关于使用 RegEx 从字符串中提取特定部分的主要内容,如果未能解决你的问题,请参考以下文章

使用Spark SQL中的regex函数从字符串中提取特定数字

从 URL 中提取部分字符串 - Java Regex

Javascript Regex 从两个不同格式的文本块中获取特定字符串

正则表达式从字符串中提取特定文本[重复]

使用python regex从字符串中提取单词

使用 c++/boost::regex 提取 HTML 文件的特定部分