代码之家  ›  专栏  ›  技术社区  ›  Nhan Phan

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

  •  0
  • Nhan Phan  · 技术社区  · 7 年前

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

    例:我有这样一根弦:

    \a{Doc Title}\aDoc ID\rDoc Date\rDoc Version\rDoc Status\a:\r:\r:\a{DocID}\r{DocDate}\r{DocVersion}\r{DocStatus}\a\r\n

    然后我想得到“\a”\r“,“\a:\r:\r:\a”。。。 我已经创建了一个模式来匹配所有“\a”、“\r”,。。。如下所示:

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

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

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   Sebastian Schumann    7 年前

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

    • {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