繁体   English   中英

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

[英]Regex to check for match and split string

给定以下格式的字符串:

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

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

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

  1. AAA
  2. BBB
  3. CC-DD
  4. EE-FFF

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

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

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

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

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

请参阅正则表达式演示

细节

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

获取所有Group“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

这个问题可以这样重写:

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

我该怎么做:

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

这看起来比一个巨大的正则表达式更易于维护,并且在性能方面应该是等效的,如果不是更快的话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM