C#正则表达式:匹配以x开头并以y结尾的字符串,不包括结尾部分&匹配模式的最后一次出现

时间:2017-04-10 19:14:28

标签: c# regex string

我有这样的sql语句,我们需要修改它以供我们自己使用:

SELECT distinct  [testCountry].[Division] as c0
FROM (....) AS testCountry 
WHERE ([testCountry].[Division] <> '' and [testCountry].[Division] is not null)
ORDER BY [testCountry].[Division] asc

(....)部分包含其他sql语句,也可能包含关键字SELECT, WHERE, ORDER BY。 在这里,我想删除最后的Where子句&#34; WHERE ([testCountry].[Division] <> '' and [testCountry].[Division] is not null)&#34;

如何为此编写正则表达式?

我已经尝试过这样的事了:

string res = Regex.Replace(originalSql, @"(WHERE[\S\s]*?)(ORDER BY)", "$2");

但它会删除其他地方的所有WHERE,后跟ORDER BY。 另外如何更简洁地编写正则表达式?

谢谢!

2 个答案:

答案 0 :(得分:2)

我知道这不是你要求的正则表达式解决方案,但它是一个解决方案。

var sql = "WHERE THIS = THIS WHERE this = that ";

var index = sql.LastIndexOf("WHERE");

var sqlnew = sql.Substring(0, index);

您可以使用上面的内容删除最后一个WHERE语句。然后,更容易在最后的句子上附加。

如果你也可以获得最后一个WHERE语句并正确地使用你需要的东西。

   var whereStatement = sql.Substring(index, sql.length);

然后得到你想要的例子......

string res = Regex.Replace(whereStatement , @"(WHERE[\S\s]*?)(ORDER BY)", "$2");

答案 1 :(得分:2)

如果您匹配其他WHERE,则无需担心更换它们。尝试

string res = Regex.Replace(originalSql, @"(.*)(WHERE[\S\s]*?)(ORDER BY)", "$1$3");

根据贪婪匹配的性质,这将确保只匹配最后一个WHERE子句。

为了记录,我更喜欢Joshua's approach。如果可以的话,避免使用正则表达式,无论谁(包括你未来的自我)都会感激不尽。