我正在尝试根据字符串中是否存在 KeyWord2 来捕获 .NET 正则表达式引擎中的KEYWORD1 。到目前为止,我正在使用的积极的环顾解决方案:
(?=.*KeyWord2)**KEYWORD1** (\m\i)
仅当KeyWord2位于字符串中 KEYWORD1后面的任何位置时才捕获KEYWORD1。如何在正则表达式中优化它,以便它捕获字符串中KEYWORD1的所有实例,尽管 KeyWord2 的位置在前面、后面或两者兼而有之?
我真的很感激一些见解。
谢谢你
我正在尝试根据字符串中是否存在 KeyWord2 来捕获 .NET 正则表达式引擎中的KEYWORD1 。到目前为止,我正在使用的积极的环顾解决方案:
(?=.*KeyWord2)**KEYWORD1** (\m\i)
仅当KeyWord2位于字符串中 KEYWORD1后面的任何位置时才捕获KEYWORD1。如何在正则表达式中优化它,以便它捕获字符串中KEYWORD1的所有实例,尽管 KeyWord2 的位置在前面、后面或两者兼而有之?
我真的很感激一些见解。
谢谢你
您可以使用下面的正则表达式来满足您的要求:
\bKEYWORD1\b(?:(?<=\bKeyWord2\b.*?)|(?=.*?\bKeyWord2\b))
上述正则表达式的解释:
gi - 使用标志(为了避免任何大小写差异)表示:g - 全局;i - 不区分大小写
\b - 表示单词边界。
(?:) - 表示非捕获组。
(?=.*?KeyWord2) - 表示与从左到右读取KeyWord2之前的所有KEYWORD1匹配的正向前瞻。
| - 代表交替;那就是它在第一个和第二个交替组之间交替。(虽然,你可以将它们包装成组。)
(?<=KeyWord2.*?) - 表示无限(因为使用了非固定宽度的惰性标识符
.*?
)正向向后查找,它匹配KeyWord2后面的所有KEYWORD1。
你可以在这里找到上面的正则表达式演示。
注意- 作为记录,这些引擎支持无限后视:
.NET(C#、VB.NET 等)
Matthew Barnett 的Python 正则表达式模块
JGSoft(EditPad 等;在编程语言中不可用)。
据我所知,他们是唯一的。
如果使用支持\G
and的正则表达式引擎,\K
则可以使用以下正则表达式。
^(?=.*\bKeyWord2\b)|\G.*?\K\bKEYWORD1\b
使用不区分大小写的标志,并根据要求设置多行标志。
使用 PCRE (PHP) 和其他一些正则表达式引擎,锚点\G
匹配上一个匹配的结尾。对于第一次匹配尝试,\G 等效于\A
,匹配字符串的开头。有关详细信息,请参阅此讨论。
\K
将报告匹配的起点重置为引擎内部字符串指针的当前位置。任何先前使用的字符都不包含在最终匹配中。实际上,\K
导致引擎“忘记”与该点匹配的所有内容。详细信息可以在这里找到。
如链接所示,字符串有四个匹配项
The KEYWORD1 before KeyWord2 then KEYWORD1 and KEYWORD1 again
它们是字符串开头的空字符串以及KEYWORD1
. 事实上,对于每个匹配的字符串,其中一个匹配项将是字符串开头的空字符串。因此,在进行替换时必须忽略空字符串。