如何替换字符串中的未知字符?通配符?

时间:2013-01-30 16:47:18

标签: c# regex string replace

我有一个字符串..让我们说:

string MyString = "SELECT Stuff FROM Table WHERE Code = "Foo" AND DATE=20120101";

我想用20120101替换?。但是,我搜索的20120101字符串并不总是相同的。它始终以2开头,并且始终包含8个字符。可能是20121225,20130510等。

我能以某种方式使用通配符吗?如:

string Fixed = MyString.Replace("2*******", "?");

我正在寻找的是这个结果:

MyString = "SELECT Stuff FROM Table WHERE Code = "Foo" AND DATE=?";

5 个答案:

答案 0 :(得分:4)

您可以使用RegEx:

Regex.Replace(input,@"DATE=""\d*""", "?");

但是,如果这是一个SQL查询,最好使用参数化查询来避免SQL注入攻击等等。这是做这类事情的行业标准方式。

答案 1 :(得分:3)

string Fixed = Regex.Replace( MyString, @"DATE=2\d{7}", "DATE=?" ); 

或者,使用积极的后视

 Replace( MyString, @"(?<=DATE=)2\d{7}", "?" ); 

答案 2 :(得分:1)

与整个字符串匹配的正则表达式可能是防止SQL注入攻击的理想选择。要完成此操作,您将使用行首(^)和行尾($)字符。

这将匹配5或6位长的东西,并捕获除第一个之外的所有内容。

^([0-9])([0-9]{4,5})$

如果你想捕获以2开头的东西,并且总是长6位数;您可以使用2而不是字符类:

^(2)([0-9]{5})$

此技术不允许直接使用replace方法,您需要提取捕获组1和2,用?替换组2中的所有字符,然后将它们连接起来。类似的东西:

matcher.group(1) + Regex.replace(m.group(2) , ".", "?")

同样,不仔细匹配整个字符串将导致SQL注入。

输入(DELETE * FROM Users Where 1=1) 200000将匹配这些正则表达式,并快速插入到您的SQL查询中:(DELETE * FROM Users Where 1=1) 2?????

答案 3 :(得分:0)

您可以使用Regex替换方法:

    string oldstring = "20120101";
    string newstring = Regex.Replace(oldstring, @"^2[0-9]{7}", "?");

答案 4 :(得分:0)

这就是你要找的东西吗?

string MyString = "SELECT Stuff FROM Table WHERE Code = {0} AND DATE={1}";

这将允许您在{0}和{1}中使用相同的字符串,例如:

String.Format(MyString, codeString, dateString);

您可以使用您想要的任何参数重复使用查询字符串。