获取与指定模式不匹配的组

时间:2018-09-20 04:36:02

标签: c# regex

我正在使用C#从指定的字符串中检索子字符串。

例如:我有一个像这样的字符串:

  

\ a {文档标题} \ aDoc ID \ rDoc日期\ rDoc版本\ rDoc状态\ a:\ r:\ r:\ r:\ a {DocID} \ r {DocDate} \ r {DocVersion} \ r {DocStatus} \ a \ a \ r

然后我要获取“ \ a”,“ \ r”,“ \ a:\ r:\ r:\ r:\ a”之间的所有子字符串... 我已经创建了一个模式来匹配所有“ \ a”,“ \ r”,...,如下所示:

((\\a[:]{0,1})+|(\\r[:]{0,1})+)+

问题是:如何获得与上述模式不匹配的所有子字符串?

预期结果是:“ {Doc Title}”,“ Doc ID”,“ Doc Date”,...

1 个答案:

答案 0 :(得分:2)

首先,请缩短您的正则表达式。

  • {0,1}?
  • [:]就是:

正则表达式的简化版是(\\[ar]:?)+。此正则表达式允许回溯导致在拆分操作中更难使用的原因。通过使用原子组来避免它:(?>\\[ar]:?)+现在,您可以拆分字符串以获取所有其他字符串并过滤空字符串:

var input = @"\a{Doc Title}\aDoc ID\rDoc Date\rDoc Version\rDoc Status\a:\r:\r:\r:\a{DocID}\r{DocDate}\r{DocVersion}\r{DocStatus}\a\a\r";
var pattern = @"(?>\\[ar]:?)+";
var items = Regex.Split(input, pattern);
foreach (var item in items)
    if (!string.IsNullOrWhiteSpace(item))
        Console.WriteLine(item);

DEMO