首页 > 解决方案 > 正则表达式匹配字符串的 3 个特定位置

问题描述

我一直在试图找到一种方法来获取字符串的 3 个部分,而无需使用拆分和一些奇怪的东西。目标字符串如下所示:

BLABLABLABLABLABLA BLABLABLA - BLABLA BLABLA (BLABLA1 BLABLA2)

我需要提取三个部分如下:

1)BLABLABLABLABLABLA BLABLABLA(左部分)

2)BLABLA BLABLA(中间部分)

3)BLABLA1 BLABLA2(括号之间的右侧部分)

我现在所做的是:

var text = "BLABLABLABLABLABLA BLABLABLA - BLABLA BLABLA (BLABLA1 BLABLA2)";

var left = Regex.Matches(text, @"([^)]*)-");
var middle = Regex.Matches(text, @"-([^)]*)\(");
var right = Regex.Matches(text, @"\(([^)]*)\)");

Console.WriteLine(left[0]);
Console.WriteLine(middle[0]);
Console.WriteLine(right[0]);

输出:

BLABLABLABLABLABLA BLABLABLA -
- BLABLA BLABLA (
(BLABLA1 BLABLA2)

似乎可以工作,但输出包含分隔符,我只想要原始内容。

标签: c#regex

解决方案


您可以使用这个单一的正则表达式并从三个组中获取所有三个值,

^(.+)\s+-\s+(.+)\s+\(([^()]+)\)$

解释:

  • ^- 匹配输入的开始
  • (.+)- 匹配并捕获任何字符一次或多次,并在空格和连字符之前停止并放在 group1 中
  • \s+-\s+- 匹配空格,后跟连字符-,再匹配空格,并将它们排除在任何组捕获的一部分之外,因为这些不是必需的
  • (.+)- 匹配一个或多个字符的下一个序列并在 group2 中捕获
  • \s+\(- 匹配一个或多个空格,后跟文字(
  • ([^()]+)(- 匹配除or以外的一个或多个任意字符)并在 group3 中捕获
  • \)$- 后跟文字)和字符串结尾

正则表达式演示

C# 代码演示

var text = "BLABLABLABLABLABLA BLABLABLA - BLABLA BLABLA (BLABLA1 BLABLA2)";

var match = Regex.Match(text, @"^(.+)\s+-\s+(.+)\s+\(([^()]+)\)$");
Console.WriteLine("left: " + match.Groups[1].Value);
Console.WriteLine("middle: " + match.Groups[2].Value);
Console.WriteLine("right: " + match.Groups[3].Value);

印刷,

left: BLABLABLABLABLABLA BLABLABLA
middle: BLABLA BLABLA
right: BLABLA1 BLABLA2

编辑: 根据您的评论,如果括号中包含的字符串的最后一部分可以是可选的,那么您可以使用此正则表达式,其中第三组是可选的。

^(.+)\s+-\s+(.+?)\s*(?:\(([^()]+)\))?$

带有 group3 的正则表达式演示是可选的

更新了 C# 演示

var text = "BLABLABLABLABLABLA BLABLABLA - BLABLA BLABLA (BLABLA1 BLABLA2)";

var match = Regex.Match(text, @"^(.+)\s+-\s+(.+)\s+\(([^()]+)\)$");
Console.WriteLine("left: " + match.Groups[1].Value);
Console.WriteLine("middle: " + match.Groups[2].Value);
Console.WriteLine("right: " + match.Groups[3].Value);

text = "BLABLABLABLABLABLA BLABLABLA - BLABLA BLABLA";

match = Regex.Match(text, @"^(.+)\s+-\s+(.+?)\s*(?:\(([^()]+)\))?$");
Console.WriteLine("\nleft: " + match.Groups[1].Value);
Console.WriteLine("middle: " + match.Groups[2].Value);
Console.WriteLine("right: " + match.Groups[3].Value);

印刷,

left: BLABLABLABLABLABLA BLABLABLA
middle: BLABLA BLABLA
right: BLABLA1 BLABLA2

left: BLABLABLABLABLABLA BLABLABLA
middle: BLABLA BLABLA
right:

推荐阅读