考虑以下文本文件;
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
幸运的是,它是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(?!^)和
:从最后匹配的位置开始并匹配“和”