3

我正在尝试根据字符串中是否存在 KeyWord2 来捕获 .NET 正则表达式引擎中KEYWORD1 到目前为止,我正在使用的积极的环顾解决方案:

(?=.*KeyWord2)**KEYWORD1** (\m\i)

正则表达式测试链接

仅当KeyWord2位于字符串中 KEYWORD1后面的任何位置时才捕获KEYWORD1。如何在正则表达式中优化它,以便它捕获字符串中KEYWORD1的所有实例,尽管 KeyWord2 的位置在前面、后面或两者兼而有之?

我真的很感激一些见解。

谢谢你

4

2 回答 2

3

您可以使用下面的正则表达式来满足您的要求:

\bKEYWORD1\b(?:(?<=\bKeyWord2\b.*?)|(?=.*?\bKeyWord2\b))

上述正则表达式的解释:

gi - 使用标志(为了避免任何大小写差异)表示:g - 全局;i - 不区分大小写

\b - 表示单词边界。

(?:) - 表示非捕获组。

(?=.*?KeyWord2) - 表示与从左到右读取KeyWord2之前的所有KEYWORD1匹配的正向前瞻。

| - 代表交替;那就是它在第一个第二个交替组之间交替。(虽然,你可以将它们包装成组。)

(?<=KeyWord2.*?) - 表示无限(因为使用了非固定宽度的惰性标识符.*?正向向后查找,它匹配KeyWord2后面的所有KEYWORD1

你可以在这里找到上面的正则表达式演示

注意- 作为记录,这些引擎支持无限后视

据我所知,他们是唯一的。

于 2020-05-16T04:45:09.793 回答
0

如果使用支持\Gand的正则表达式引擎,\K则可以使用以下正则表达式。

^(?=.*\bKeyWord2\b)|\G.*?\K\bKEYWORD1\b

使用不区分大小写的标志,并根据要求设置多行标志。

PCRE 演示

使用 PCRE (PHP) 和其他一些正则表达式引擎,锚点\G匹配上一个匹配的结尾。对于第一次匹配尝试,\G 等效于\A,匹配字符串的开头。有关详细信息,请参阅此讨论

\K将报告匹配的起点重置为引擎内部字符串指针的当前位置。任何先前使用的字符都不包含在最终匹配中。实际上,\K导致引擎“忘记”与该点匹配的所有内容。详细信息可以在这里找到。

如链接所示,字符串有四个匹配项

The KEYWORD1 before KeyWord2 then KEYWORD1 and KEYWORD1 again

它们是字符串开头的空字符串以及KEYWORD1. 事实上,对于每个匹配的字符串,其中一个匹配项将是字符串开头的空字符串。因此,在进行替换时必须忽略空字符串。

于 2020-05-16T18:54:39.027 回答