根据此问题/答案,我使用以下正则表达式解析括号中数字的名称,给出:
使用我的C#代码:
var found = Regex.Match("morleyc (1005)", @"(\S*)\s*\((\d*)", RegexOptions.IgnoreCase)
我得到一个3个项目的数组,而我希望一个2个元素数组只包含第二个和第三个项目:
morleyc (1005
morleyc
1005
这就是我所期望的(根据regexstorm.net元素):
morleyc
1005
请告知我在代码中做错了什么?
.净小提琴@https://dotnetfiddle.net/5DVWPs
也许,你想要
@"(?<name>\w+)\s*\((?<number>[0-9]+)\)"
模式,在哪里
\w+ - one or more word (letter or digit) characters for name
\s* - optional (zero or more) whitespaces
\([0-9]+\) - one or more digits in parenthesis for number
注意:命名捕获组:
(?<name> ... ) - part of the match which stands for name
(?<number> ... ) - -/- stands for number
如果名称只能包含字母(不允许数字),则可以
@"(?<name>\p{L}+)\s*\((?<number>[0-9]+)\)"
模式,其中\p{L}
表示unicode字母
演示:
var found = Regex.Match(
"morleyc (1005)",
@"(?<name>\w+)\s*\((?<number>[0-9]+)\)",
RegexOptions.IgnoreCase);
Console.WriteLine($"Name: {found.Groups["name"].Value}");
Console.WriteLine($"Number: {found.Groups["number"].Value}");
结果:
Name: morleyc
Number: 1005
小提琴
结果中的morleyc(1005
部分是完全匹配。模式也不匹配关闭)
您可以检查是否存在匹配,如果存在,则仅获取组1和组2的值。
请注意,在模式中,除了(
)之外,几乎所有内容都是可选的,因此它也可以匹配单个(
var found = Regex.Match("morleyc (1005)", @"(\S*)\s*\((\d*)\)", RegexOptions.IgnoreCase);
if (found.Success) {
Console.WriteLine(found.Groups[1].Value);
Console.WriteLine(found.Groups[2].Value);
}
看小提琴。
输出
morleyc
1005
更具体的模式可能是:
(\S+)[\p{Zs}\t]+\(([0-9]+)\)
(\S)
捕获组1,匹配1个非空白字符.NET正则表达式演示
你做得很对。根据。NET留档:
Groups属性返回的GroupCollection对象的第一个元素(索引0处的元素)包含与整个正则表达式模式匹配的字符串
因此,带有2个组的正则表达式模式将返回3个结果: