如何在这种情况下使用Regex.Replace?

时间:2013-03-10 16:28:50

标签: c# .net regex replace

我正在使用正则表达式检查字符串的正确性(我想允许字符A-Za-z*space- &%./+)。我的代码是这样的:

Regex r = new Regex("^[A-Z0-9.$/+%\\- ]+$");
string myString = "ABCDEFGH 12345 $%...     A"; //string ok

if (r.IsMatch(myString))
  System.Console.WriteLine("String alright!");

这很有效,一切都很好。现在我只是想,也许我也可以处理非正确的字符串。我想用-替换字符串中的非正确(非正则表达式有效)字符。这可以通过Regex.Replace来完成。所以我做到了:

Regex r = new Regex("^[A-Z0-9.$/+%\\- ]+$");
string myString = "HELLO WÖRLD ß~# 50.00$"; //Ö,ß,~,# should be replaced by -

if (r.IsMatch(myString))
  System.Console.WriteLine("String alright!");
else
  myString = Regex.Replace(myString, r.ToString(), "-");

System.Console.WriteLine(myString);

这是不行的!作为输出我得到:

HELLO WÖRLD ß~# 50.00$

我错过了什么?问题是正则表达式对吗?我可以检查字符串是否正确,但我无法正确使用此正则表达式Regex.Replace函数。有没有办法使用1个正则表达式来检查字符串是否有效并使用Regex.Replace

3 个答案:

答案 0 :(得分:4)

如果要(匹配和)替换与验证表达式中的字符不匹配的字符,则需要另一个表达式来专门匹配这些字符。例如:

[^A-Z0-9.$/+%\- ]

可以用作:

myString = Regex.Replace(myString, @"[^A-Z0-9.$/+%\- ]", "-");

答案 1 :(得分:3)

您的代码实际上没有意义 如果r.IsMatch()返回false,则表示正则表达式与字符串不匹配,因此替换任何匹配项都不会产生影响。 (没有匹配)

相反,您应该创建一个匹配任何无效字符的正则表达式,检查是否匹配,如果匹配,则调用.Replace()


另外,你是在滥用正则表达式。

如果您有Regex个实例,则应调用其Replace 实例方法:

myString = r.Replace(myString, "-");

答案 2 :(得分:0)

您的替换没有发生,因为正则表达式找不到任何要替换的东西。

使用相同的正则表达式可以做的是将'myString'转换为字符并检查每个字符的有效性。

示例(来自java,但应该很容易理解):

if (r.IsMatch(myString)){
            System.Console.WriteLine("String alright!");
}  else {

    // java iteration
    for(int i = 0; i < myString.length(); i++){
        Character c = myString.charAt(i);
        if(!c.toString().matches(reg)){
            myString = myString.replace(c.toString(), "-");
        }
    }

}