正则表达式匹配字符串的3个特定位置

时间:2019-04-24 06:53:14

标签: c# regex

我一直在努力寻找一种方法来获取字符串的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)

似乎可以正常工作,但是输出中包含定界符,我只想要原始内容。

1 个答案:

答案 0 :(得分:3)

您可以使用此正则表达式从三个组中获取所有三个值,

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

说明:

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

Regex Demo

C# Code demo

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*(?:\(([^()]+)\))?$

Regex Demo with group3 being optional

Updated C# demo

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: