C# 与SQL对象(表/函数/视图)匹配的正则表达式模式?

C# 与SQL对象(表/函数/视图)匹配的正则表达式模式?,c#,.net,sql,regex,vb.net,C#,.net,Sql,Regex,Vb.net,问题: 给定一个SQL字符串,如 CREATE VIEW TestView AS SELECT value1, value2 FROM TABLE_0 UNION (SELECT * FROM TABLE_2) AS value1 ,value2 FROM TABLE_12 UNION SELECT * FROM TABLE_3 (小写) 和一个字符串数组 string[] tables = new string[]{"table_1", "table_2", "table_3"} 现

问题:

给定一个SQL字符串,如

CREATE VIEW TestView AS
SELECT value1, value2 
FROM TABLE_0
UNION
(SELECT * FROM TABLE_2) AS value1
,value2 
FROM TABLE_12 
UNION
SELECT * FROM TABLE_3
(小写)

和一个字符串数组

string[] tables = new string[]{"table_1", "table_2", "table_3"}
现在我做到了:

if (strViewDefinition.Contains(strObjectName)) // aaaaargh
对于表中的每个strObjectName,检查视图是否依赖于此对象

但这在表_12上失败(并导致循环依赖),例如,因为表包含“表_1”。啊

我需要一个正则表达式,可以检查视图定义是否包含函数名、表值函数或其他视图

( 核对 System.Text.RegularExpressions.Regex.IsMatch( )

我的审判是:

string whateverneedsescaping= System.Text.RegularExpressions.Regex.Escape(@"+-*\/%=,\n\r");
string fieldsep = @"[\s\n\r," + whateverneedsescaping+ "]*";
string strPattern = fieldsep + "VIEW/FUNCTION_NAME" + fieldsep;
但它失败了,而且它没有考虑括号中包含的对象名称,比如

 "[TABLE_NAME]"

任何人都可以帮忙吗?

表达式
\bname\b
就足够了吗?
\b
是一个

例如,
\b表1\b
表12
不匹配


如果你有很多名字,你可以用一个类似
\b(?:foo | bar | baz)\b

的表达式来检查它们。我认为它不起作用的原因是因为你的字符集中有
-
字符。这个字符不是由
正则表达式转义的,因此你的字符集最终包含以下内容:

[\s\n\r,\+-\*\\/%=,\\n\\r]
此集合中的
-
尝试在文本字符
+
*
之间创建一个范围,该范围没有任何意义,因此它以相反的顺序抛出带有消息
[x-y]范围的ArgumentException

虽然我不能100%确定我是否理解您的确切要求,但我认为使用Qtax中的单词边界的建议是可行的

我想补充的是,您可以通过将表名更改为:

\[?\btable_1\b]?
这就是工作:

string strSchema = "dbo";
string strRegexObjectName = System.Text.RegularExpressions.Regex.Escape(strObjectName);
string strPattern = @"[\s\+\-\(,/%=\*\\](\[?" + strSchema + @"\]?\.)?\[?" + strRegexObjectName + @"\]?([\s\+\-\),/%=\*\\]|$)";

@马克·班尼斯特:是的,这是SQL Server。但是SQL Server 2005。另外,它也适用于其他数据库系统,所以不要推荐我使用SMO(顺便说一句,SQL 2005上的buggy);-)它比这个(单词边界)要复杂一点,但是谢谢你的建议,可以一次完成所有的工作。