我一直在努力寻找一种方法来获取字符串的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)
似乎可以正常工作,但是输出中包含定界符,我只想要原始内容。
答案 0 :(得分:3)
您可以使用此正则表达式从三个组中获取所有三个值,
^(.+)\s+-\s+(.+)\s+\(([^()]+)\)$
说明:
^
-匹配输入的开始(.+)
-匹配并捕获一次或多次任何字符,并在空格和连字符之前停在第1组并停在\s+-\s+
-匹配空格,后跟连字符-
,再匹配空格,并将它们排除在任何组捕获的一部分之外,因为这些不是必需的(.+)
-匹配下一个或多个字符序列并捕获到group2中\s+\(
-匹配一个或多个空格,后跟文字(
([^()]+)
-匹配一个或多个(
或)
以外的任何字符并捕获到组3中\)$
-后跟文字)
和字符串结尾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
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: