c# - 正则表达式匹配字符串的 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)
似乎可以工作,但输出包含分隔符,我只想要原始内容。
解决方案
您可以使用这个单一的正则表达式并从三个组中获取所有三个值,
^(.+)\s+-\s+(.+)\s+\(([^()]+)\)$
解释:
^
- 匹配输入的开始(.+)
- 匹配并捕获任何字符一次或多次,并在空格和连字符之前停止并放在 group1 中\s+-\s+
- 匹配空格,后跟连字符-
,再匹配空格,并将它们排除在任何组捕获的一部分之外,因为这些不是必需的(.+)
- 匹配一个或多个字符的下一个序列并在 group2 中捕获\s+\(
- 匹配一个或多个空格,后跟文字(
([^()]+)
(
- 匹配除or以外的一个或多个任意字符)
并在 group3 中捕获\)$
- 后跟文字)
和字符串结尾
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*(?:\(([^()]+)\))?$
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:
推荐阅读
- javascript - 完整日历 | 特定事件的 Dayrender?
- robotframework - 如果不更新其余代码中的变量,机器人框架运行关键字?
- html - 如何在 safari (odoo 11) 上使用 html 视频标签?
- java - 我可以从
- css - 在父 div(均为固定宽度)内添加垂直子 div,并在父级别使用动态水平滚动条
- react-native - 为什么具有 onPress={action} 的 navigationOptions => headerLeft 中的按钮不起作用?反应原生
- postgresql - 创建一个聚合函数,该函数返回与最大 column2 值关联的 column1 值
- reactjs - 未找到 scheduler@^0.13.4 的匹配版本
- django - 在带有正则表达式的模板中使用 django cut filter
- java - 如何打印二维数组的间隔