首页 > 解决方案 > 正则表达式检查匹配和拆分字符串

问题描述

给定以下格式的字符串:

xxx (aaa - bbb - CC-dd - ee-FFF)

如果括号内有超过 3 个“-”字符串,我需要编写一个返回匹配项的正则表达式。

它还需要拆分字符串(通过“ - ” - 空格、连字符、空格)并在单独的匹配中返回每个组。所以给定上面的字符串,我期望以下匹配:

  1. 啊啊啊
  2. bbb
  3. 抄送
  4. ee-FFF

我有以下正则表达式...

\((([\w]).*(.[-].*?){3,}([\w]))\)

但我正在努力拆分字符串并返回我需要的匹配项。

标签: .netregex

解决方案


您可以使用基于缓和贪婪令牌的正则表达式:

\((?<o>(?:(?! - )[^()])+)(?: - (?<o>(?:(?! - )[^()])+)){3,}\)

查看正则表达式演示

细节

  • \(- 一个(字符
  • (?<o>(?:(?! - )[^()])+)- 组“o”:除(and之外的任何字符),出现 1 次或多次,不开始space-space序列
  • (?: - (?<o>(?:(?! - )[^()])+)){3,}- 出现三个或更多
    • - - 空间-空间
    • (?<o>(?:(?! - )[^()])+)- 组“o”:除(and之外的任何字符),出现 1 次或多次,不开始space-space序列
  • \)- 一个)字符

获取所有组“o”捕获以提取值。

C# 演示

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

推荐阅读