以下是我的示例代码:
string pattern = "(@param)(?=.*where)";
string updateQuery = @"update Table set column = @param where otherColumn = @param";
string newUpdateQuery = Regex.Replace(updateQuery, pattern , "CONVERT(NVARCHAR,'param')");
Console.WriteLine(newUpdateQuery);
string insertQuery = @"insert into Table (column) values(@param)";
string newInsertQuery = Regex.Replace(insertQuery, pattern , "CONVERT(NVARCHAR,'param')");
Console.WriteLine(newInsertQuery);
输出:
update Table set column = CONVERT(NVARCHAR,'param') where otherColumn = @param
insert into Table (column) values(@param)
在条件之前我想要匹配参数 但在插入查询中,此模式无法匹配任何参数 如果加'?'像这样的模式
string pattern = "(@param)(?=.* where)?"
输出将成为
update Table set column = CONVERT(NVARCHAR,'param') where otherColumn = CONVERT(NVARCHAR,'param')
insert into Table (column) values(CONVERT(NVARCHAR,'param'))
这个输出是我想要的:
update Table set column = CONVERT(NVARCHAR, 'param') where otherColumn = @param
insert into Table(column) values(CONVERT(NVARCHAR, 'param'))
如果查询具有where条件 只在“where”
之前匹配param答案 0 :(得分:4)
如果前面没有@param
,您需要确保只匹配where
:
string pattern = @"(?<!\bwhere\b.*)@param";
请参阅C# demo
模式详情
(?<!\bwhere\b.*)
- 如果有一个完整的单词where
(\b
是单词边界),那么会导致匹配失败的负面反馈,并且会再次显示除换行符之外的任何0 +字符。当前位置的左侧@param
- 一个文字子字符串(如果需要,在末尾添加\b
以匹配整个单词)。完整的C#测试:
string pattern = @"(?<!\bwhere\b.*)@param";
string updateQuery = @"update Table set column = @param where otherColumn = @param";
string newUpdateQuery = Regex.Replace(updateQuery, pattern , "CONVERT(NVARCHAR,'param')");
Console.WriteLine(newUpdateQuery); // => update Table set column = CONVERT(NVARCHAR,'param') where otherColumn = @param
string insertQuery = @"insert into Table (column) values(@param)";
string newInsertQuery = Regex.Replace(insertQuery, pattern , "CONVERT(NVARCHAR,'param')");
Console.WriteLine(newInsertQuery); // => insert into Table (column) values(CONVERT(NVARCHAR,'param'))