给出以下格式的字符串:
xxx (aaa - bbb - CC-dd - ee-FFF)
我需要编写一个正则表达式,如果括号中的字符串超过3个,则返回一个匹配项。
它还需要分割字符串(用“-”-空格,连字符,空格),并在单独的匹配项中返回每个组。 因此,鉴于上述字符串,我期望以下匹配项:
我有以下正则表达式...
\((([\w]).*(.[-].*?){3,}([\w]))\)
但是我正在努力分割字符串并返回我需要的匹配项。
答案 0 :(得分:3)
您可以使用基于tempered greedy token的正则表达式:
\((?<o>(?:(?! - )[^()])+)(?: - (?<o>(?:(?! - )[^()])+)){3,}\)
请参见regex demo
详细信息
\(
-一个(
字符(?<o>(?:(?! - )[^()])+)
-组“ o”:除(
和)
以外的任何字符,出现1次或多次,而不是开始space-space
序列(?: - (?<o>(?:(?! - )[^()])+)){3,}
-出现3次或更多
-
-空格-
空格(?<o>(?:(?! - )[^()])+)
-组“ o”:除(
和)
以外的任何字符,出现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
答案 1 :(得分:0)
这个问题可以这样改写:
您需要使用“-”作为分隔符在括号之间分割文本,并确定是否有4个或更多文本片段。
我将如何做:
\(([^\)]+)\)
与庞大的正则表达式相比,它看起来更具可维护性,并且在性能方面应该相当,甚至更快。