使用不带K选项(C#)的REGEX只获取字符串的第三个匹配项

本文关键字:字符串 三个 获取 REGEX 选项 | 更新日期: 2023-09-27 17:57:34

我有一个如下的正则字符串:

xxSTART Here we have the first text in 1234 asdf xxENDxxSTART Here we have the second text 999 fffd xxENDxxSTART Here we have the third text 1234 9985Df xxENDxxSTART Here we have the fourth text 1234 asdf Dert xxEND

我使用以下REGEX:^(?:(.*?)'K(xxSTART)){3}(.*?xxEND)来获得第三个匹配xxSTART Here we have the third text 1234 9985Df xxEND。这在http://www.regexr.com/v1/,但我读过一篇文章,说'K选项不是C#中的选项(regex中对''K的支持),还有一篇文章《将Perl正则表达式翻译为.NET》说要使用look-behind ((?<=…))。但我不能在我的RegEX中使用((?<=…))背后的look,有人能帮我吗?请

有人知道如何在我的RegEX ^(?:(.*?)'K(xxSTART)){3}(.*?xxEND)中使用((?<=…))来替换'K选项吗?

谢谢问候,

使用不带K选项(C#)的REGEX只获取字符串的第三个匹配项

在这里你真的不需要后备,你可以匹配xxSTART,仍然可以得到你想要得到的第三部分:

^(?:xxSTART.*?){3}'s*(.*?)xxEND

视频演示

但是,如果你真的想使用lookbacking(以防你不想要任何捕获组,好吧,在这种情况下,你可以考虑使用xxEND的lookbacking),你会使用这样的东西:

(?<=^(?:xxSTART.*?){3}'s*).*?(?=xxEND)

视频演示

只需使用这个:

^(?:xxSTART.*?xxEND){2}(xxSTART.*?xxEND)

先跳过前两个区块,然后捕获第三个区块。这里不需要后备断言。

一个简单的方法是不在正则表达式内部施加此限制,而是在外部进行计数:

use strict;
use warnings;
my $data = do {local $/, <DATA>};
my $count = 0;
while ($data =~ /(?<=xxxSTART)(.*?)(?=xxEND)/g) {
    if (++$count == 3) {
        print $1;
        last;
    }
}
__DATA__
xxSTART Here we have the first text in 1234 asdf xxENDxxSTART Here we have the second text 999 fffd xxENDxxSTART Here we have the third text 1234 9985Df xxENDxxSTART Here we have the fourth text 1234 asdf Dert xxEND

输出:

 Here we have the third text 1234 9985Df