.net 如何在正向前瞻(问号等于)中在整个模式上正确拆分正则表达式

.net 如何在正向前瞻(问号等于)中在整个模式上正确拆分正则表达式,.net,regex,.net,Regex,我想对标记的所有实例进行拆分,该标记后跟一个相同大写字符的序列,后跟一个句点。例如A.和BB.会匹配,但A.、AB.、Aa.和C不会匹配。这是我的正则表达式(我正在使用.NET): (?=\s*([A-Z])\1*\) 问题在于,拆分列表是 A A. 当它应该是1的时候A.(我希望匹配的模式包含在拆分列表中,这是具有正向前瞻性的原因) 我认为这是由于([A-Z])周围有括号,这是使用\1创建捕获组以匹配同一字符所必需的。我正在使用来测试这一点。您实际上可以使用正则表达式来匹配字符串中的位置,并从

我想对
标记的所有实例进行拆分,该标记后跟一个相同大写字符的序列,后跟一个句点。例如
A.
BB.
会匹配,但
A.
AB.
Aa.
C
不会匹配。这是我的正则表达式(我正在使用.NET):

(?=\s*([A-Z])\1*\)

问题在于,拆分列表是

  • A

  • A.

  • 当它应该是1的时候<代码>A.(我希望匹配的模式包含在拆分列表中,这是具有正向前瞻性的原因)


    我认为这是由于
    ([A-Z])
    周围有括号,这是使用
    \1
    创建捕获组以匹配同一字符所必需的。我正在使用来测试这一点。

    您实际上可以使用正则表达式来匹配字符串中的位置,并从以前找到的索引中附加子字符串:

    var text = "<p>AI.For example <p>A.I<p>BB.";
    var result = new List<string>();
    var rx = new Regex(@"(?=<p>\s*([A-Z])\1*\.)");   // The zero-length matching regex used in Regex.Split
    var idx = 0;
    foreach (Match m in rx.Matches(text)) {           // Iterate over all matches
        result.Add(text.Substring(idx, m.Index-idx)); // Add item to resulting array
        idx = m.Index;
    }
    if (idx < text.Length - 1) {         // Add trailing text after last match if present
        result.Add(text.Substring(idx));
    }
    

    请参阅。

    是,当捕获组出现在正则表达式中时,所有捕获都作为结果数组的一部分输出。是的,因此问题在于实际上有两种捕获在起作用:整个模式匹配将包含在拆分列表中,而单数字符则确保重复的是同一个字母。没有办法区分它们,只是将整个匹配项放在分裂列表中。我能想到的唯一一个regex我能想到的是
    (《p=\s*(((::::)没有办法区分它们,没有办法区分它们,只有将整个匹配项放在分裂列表中。我能想到的唯一一个regex我能想到的regex是我能想到的唯一的regex是:
    (:)我能想到的唯一的是我能想到的。我能想到的唯一的regex我能想到的是我能想到的唯一的是:::<代码是:::
    >>>(((:::)我能想到的我能想到的是::::)我能想到的,s************((((::::::::::::::::::::::::((:::::::::当然,这是一个我喜欢的聪明的解决方案。不幸的是,我不得不使用一个共享基类,该基类使用了
    Regex.Split
    ,我无法修改您答案中的效果,但我将其标记为已接受,因为它应该可以正常工作。@Drew Well,我将这些方法共享为
    Regex.Split
    捕获组的行为无法重新定义:(我尝试了一种匹配方法,但我遇到了一个bug(或“特性”),它涉及.NET正则表达式如何处理连续的零长度匹配。
    <p>AI.For example 
    <p>A.I
    <p>BB.
    
    var text = "aaa<p>AI.For example <p>A.I<p>BB.b";
    text = Regex.Replace(text, @"(?=<p>\s*([A-Z])\1*\.)", "\uFFFF");
    var result = text.Split('\uFFFF');
    Console.WriteLine(string.Join("\n", result)); // => [aaa<p>AI.For example, <p>A.I, <p>BB.b]