RegEx与报价中的项目不匹配

时间:2009-10-13 16:24:41

标签: sql regex

所以我试图找出一个正则表达式,并且遇到了一些问题。我想要查找(匹配)的是大型脚本文件中的所有SQL参数,但不匹配单引号中的项(例如电子邮件地址)。例如:

INSERT INTO [User]
(
   [UserGuid], [CompanyGuid], [Name], [EmailAddress]
) VALUES (
   @UserGuid1, @CompanyGuid, 'Jason', 'jason@jason.com'
)

@UserGuid1@CompanyGuid匹配,但不匹配@jason。我一直在使用这个RegEx:

(@+[\w]+)

但它与电子邮件地址相符,所以我试图像这样做一个负面的前瞻/后退:

(?<!')[\W](@+[\w]+)[\W](?!')

但它与以下示例中的'('匹配:

INSERT INTO [User] ([UserGuid]) VALUES (@UserGuid1)

任何人都知道我在这里缺少什么?可以说:“任何不在报价集中的东西?”。此外,假设平衡报价集是安全的。

3 个答案:

答案 0 :(得分:2)

你试过以下吗?

(?<=\W)(@\w+)

基本上它确保捕获的值前面带有非单词字符,你也可以添加前瞻但它有点多余,因为+是贪婪的,无论如何都会匹配到非单词。

以下内容将确保在INSERT INTO [User] ([UserGuid]) VALUES ('@UserGuid1')中没有任何内容匹配:

(?<![\w'])(@\w+)

答案 1 :(得分:1)

(@ + [^'] +)应该有所帮助。 [^',]将匹配除单引号,空格或逗号之外的任何内容。您可能需要添加更多字符,但这是一般的想法。

答案 2 :(得分:1)

试试这个:

(?<=[^\w'])(@\w+)(?!')

这指定每个匹配必须以非单词字符开头(单引号除外),然后有一个@符号和一个单词,而不是后跟另一个单引号。