正则表达式以检查匹配和拆分的字符串

时间:2018-10-04 12:33:06

标签: .net regex

给出以下格式的字符串:

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

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

它还需要分割字符串(用“-”-空格,连字符,空格),并在单独的匹配项中返回每个组。 因此,鉴于上述字符串,我期望以下匹配项:

  1. aaa
  2. bbb
  3. CC-dd
  4. ee-FFF

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

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

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

2 个答案:

答案 0 :(得分:3)

您可以使用基于tempered greedy token的正则表达式:

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

请参见regex demo

详细信息

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

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

C# demo

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

答案 1 :(得分:0)

这个问题可以这样改写:

您需要使用“-”作为分隔符在括号之间分割文本,并确定是否有4个或更多文本片段。

我将如何做:

  1. 使用正则表达式获取文本,例如:\(([^\)]+)\)
  2. 使用String.Split(“-”)分割匹配的文本
  3. 检查返回数组中的元素数是否> 3

与庞大的正则表达式相比,它看起来更具可维护性,并且在性能方面应该相当,甚至更快。