C# 如何执行反向后视?
我正在尝试执行一个正则表达式否定查找,它将发现SQL中存在一个不属于注释的关键字 乙二醇C# 如何执行反向后视?,c#,regex,C#,Regex,我正在尝试执行一个正则表达式否定查找,它将发现SQL中存在一个不属于注释的关键字 乙二醇 ——一些注释创建 /*还有更多的评论 再创造一些 */ 创造 只有最后一个create关键字应该匹配,因为所有其他关键字都在注释中 到目前为止,我有这个 (?我认为删除注释更容易,这就是: // use these regex patterns public string RemoveSQLComments(string sqlQuery) {
——一些注释创建
/*还有更多的评论
再创造一些
*/
创造
只有最后一个create关键字应该匹配,因为所有其他关键字都在注释中
到目前为止,我有这个
(?我认为删除注释更容易,这就是:
// use these regex patterns
public string RemoveSQLComments(string sqlQuery)
{
Regex r1 = new Regex(@"(\/\*)(?s:(?!\*\/).)*(\*\/)", System.Text.RegularExpressions.RegexOptions.Multiline &
System.Text.RegularExpressions.RegexOptions.IgnoreCase);
Regex r2 = new Regex("(--)[^\r\n$]*(?=(\r|\n|$))", System.Text.RegularExpressions.RegexOptions.Multiline &
System.Text.RegularExpressions.RegexOptions.IgnoreCase);
return r2.Replace(r1.Replace(sqlQuery, ""), "");
}
结果将是没有任何注释的SQL字符串
(?<!--.*)(?<!/\*(?s:(?!\*/).)*)\bcreate\b
每次它匹配一个字符时,它都会首先进行负向前瞻,以确保它不是您试图排除的序列中的第一个字符
s中的s
(?s:
使该组中的所有内容在单线
模式下匹配,这意味着
与换行符匹配。添加信息时请发帖子。不确定C#
是否实现了可变长度的负后向查找。@Toto:是的,.NET正则表达式支持无限宽度的后向查找。Dave,您可以只匹配和捕获注释,然后只匹配创建
,以便对其执行任何更改。请参阅Wiktor的注释解决了我的问题。感谢所有其他人的贡献。这里有几个问题,包括:(1)(
和)
在字符类中没有特殊意义,以及(2)你可以使用
组合选项,而不是&
;因为这两个选项都不会对你的正则表达式产生任何影响。而且,没有必要将答案与完整的名称空间混在一起;可以假设问C问题的人都知道如何使用使用。你的第一个正则表达式与包含这是(
、*
、/
或)
中的任何一个字符,如/*(完全有效/注释)*/
。您试图做的事情需要一个消极的前瞻,正如我在回答中所演示的:(?!\*/)*
。使用和组合选项可确保不会应用任何选项。您的正则表达式匹配,因为您不需要任何选项。
(?s:(?!\*/).)*