使用负面看后面仍然返回匹配的子表达式

时间:2014-11-12 15:36:02

标签: c# .net regex lookbehind

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

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

我使用以下正则表达式:

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

它确实捕获了除第一个之外的所有事件,但匹配仅包含.dbo.MyTable,而不包含负面后卫忽略的前一个值。我怎样才能抓住缺失的部分?

2 个答案:

答案 0 :(得分:3)

您可以在lookbehind之前加上\w来匹配单词字符,以匹配整个子字符串。

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

Explanation | Live Demo

答案 1 :(得分:0)

更改正则表达式以使用否定前瞻:

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

或者使用带有捕获的正面lookbehind(这将是.NET支持的可变长度lookbehind):

(?<!Test1)(?<=(\w+))\.dbo\.

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