使用负向后看,同时仍返回匹配的子表达式

本文关键字:返回 表达式 | 更新日期: 2023-09-27 18:30:17

所以我可以使用负回溯来搜索字符串的所有出现<ANYTHING>.dbo.TableName其中<ANYTHING>不是某个特定的字符串。问题是返回的匹配项没有捕获<ANYTHING>子表达式的值。例如,如果我有以下文本:

Test1.dbo.MyTable
Test2.dbo.MyTable
Test123.dbo.MyTable
Test223.dbo.MyTable

我使用以下正则表达式:

(?<!Test1)'.dbo'.MyTable

它确实捕获除第一个匹配项之外的所有匹配项,但匹配项仅包含.dbo.MyTable,而不包含负面后视忽略的前面的值。如何抓住缺失的部分?

使用负向后看,同时仍返回匹配的子表达式

您可以在查找后备之前加上'w以匹配单词字符,以便匹配整个子字符串。

'w+(?<!Test1)'.dbo'.MyTable

解释 |现场演示

要么更改正则表达式以使用负面展望:

^(?!Test1)'w+'.dbo'.

或者对捕获使用正面回溯(这将是 .NET 支持的可变长度回溯

):
(?<!Test1)(?<=('w+))'.dbo'.

第一种方法是更清洁的IMO。