使用负向后看,同时仍返回匹配的子表达式
本文关键字:返回 表达式 | 更新日期: 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。