提问者:小点点

在`,`之后的Regex捕获由`和`分隔的所有文本


考虑以下文本文件;

NETHERLANDS (THE)
BOLIVIA (PLURINATIONAL STATE OF)
COCOS (KEELING) ISLANDS (THE)
ANTIGUA AND BARBUDA

TEST1, SOME TEXT
TEST2, SAINT HELENA AND ASCENSION AND TRISTAN DA CUNHA
TEST3, BONAIRE AND SINT EUSTATIUS AND SABA

我试图捕获第一个之后的所有字符,并可选地用分隔,期望的结果是:

No Match (no ,)
No Match (no ,)
No Match (no ,)
No Match (no ,)

SOME TEXT
SAINT HELENA - ASCENSION - TRISTAN DA CUNHA
BONAIRE - SINT EUSTATIUS - SABA

以这篇文章为例,我创建了以下正则表达式:

/(?<= AND |\, )(.*)(?= AND |$)/mU

regex101

正如您在这里看到的,除了一个不包含(AntiguaandBarbuda)的情况外,这个操作很好

null


共2个答案

匿名用户

幸运的是,它是PCRE,您可以使用\g:

(?>,|\G(?!\A) +AND) +\K(?>(?! +AND).)+

在此查看现场演示

要加速匹配过程,在之前匹配^[^,]*将会有帮助:

(?>^[^,]*,|\G(?!\A) +AND) +\K(?>(?! +AND).)+

首先,我们有两个选择:1)匹配或2)\g(?!\a)\g(?!\a)意味着应该从上一个匹配结束的地方继续匹配。因此,在进一步匹配之前,应该始终匹配一个

匹配之后,我们尝试匹配之前的任何其他内容。 这是通过以下部分完成的:

 +\K(?>(?! +AND).)+
^ This is a space!

这里的\k元字符负责不包括到目前为止匹配的匹配项。 换句话说,它是一个匹配重置器。 由于您不需要任何提前到来的内容,所以我们使用\k从输出中删除它们。

在一场完整的比赛之后,下一场比赛应该从第二次交替开始,这是:

\G(?!\A) +AND

它会查找前面有空格的,然后我们又得到了我们想要的模式。

匿名用户

将我的评论转换为回答。

此正则表达式可能适用于OP:

(?:^[^,]*, |\G(?!^) AND )\K.+?(?= AND |$)

更新的RegEx演示

正则表达式详细信息:

  • (?::启动非捕获组
    • ^[^,]*,:行开头后跟0个或多个非逗号字符,后跟逗号和空格
    • :或
    • \g(?!^)和:从最后匹配的位置开始并匹配“和”