使用 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
解释:
(?<=\()
:正向寻找(
意味着匹配将在(
之后开始,而不会将其捕获到结果中。
\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函数从字符串中提取特定数字