.net - 正则表达式检查匹配和拆分字符串
问题描述
给定以下格式的字符串:
xxx (aaa - bbb - CC-dd - ee-FFF)
如果括号内有超过 3 个“-”字符串,我需要编写一个返回匹配项的正则表达式。
它还需要拆分字符串(通过“ - ” - 空格、连字符、空格)并在单独的匹配中返回每个组。所以给定上面的字符串,我期望以下匹配:
- 啊啊啊
- bbb
- 抄送
- ee-FFF
我有以下正则表达式...
\((([\w]).*(.[-].*?){3,}([\w]))\)
但我正在努力拆分字符串并返回我需要的匹配项。
解决方案
您可以使用基于缓和贪婪令牌的正则表达式:
\((?<o>(?:(?! - )[^()])+)(?: - (?<o>(?:(?! - )[^()])+)){3,}\)
查看正则表达式演示
细节
\(
- 一个(
字符(?<o>(?:(?! - )[^()])+)
- 组“o”:除(
and之外的任何字符)
,出现 1 次或多次,不开始space-space
序列(?: - (?<o>(?:(?! - )[^()])+)){3,}
- 出现三个或更多-
- 空间-
空间(?<o>(?:(?! - )[^()])+)
- 组“o”:除(
and之外的任何字符)
,出现 1 次或多次,不开始space-space
序列
\)
- 一个)
字符
获取所有组“o”捕获以提取值。
var s = "xxx (aaa - bbb CC - dd - ee-FFF) (aaa2 - bbb2 CC2- dd2- ee2-FFF2)";
var pattern = @"\((?<o>(?:(?! - )[^()])+)(?: - (?<o>(?:(?! - )[^()])+)){3,}\)";
var ms = Regex.Matches(s, pattern);
foreach (Match m in ms)
{
Console.WriteLine($"Matched: {m.Value}");
var res = m.Groups["o"].Captures.Cast<Capture>().Select(x => x.Value);
Console.WriteLine(string.Join("; ", res));
}
输出:
Matched: (aaa - bbb CC - dd - ee-FFF)
aaa; bbb CC; dd; ee-FFF
推荐阅读
- pandas - 通过 pandas 将 csv 导入转换为单独的列
- coldfusion - 如何在 QueryExecute sql 语句中正确转义冒号?
- mysql - 从表中选择所有早于 3 天的条目
- java - IntelliJ 无法识别来自 gradle 项目的某些导入
- python - 将元组列表混合并迭代到文本模板中
- python - 我是否在 python 中正确解释了这个列表理解?
- javascript - 如何在 node.js 中定义全局变量
- javascript - 如何使用 lodash 区分大小写包含搜索
- javascript - 将数据解析为 JSON
- python - 使用列表检查用户名和密码