3

我正在使用正则表达式来检查字符串的正确性(我想允许字符A-Z, a-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

4

3 回答 3

4

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

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

可以用作:

myString = Regex.Replace(myString, @"[^A-Z0-9.$/+%\- ]", "-");
于 2013-03-10T16:34:08.310 回答
3

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

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


此外,您正在滥用正则表达式。

如果你有一个Regex实例,你应该调用它的Replace 实例方法:

myString = r.Replace(myString, "-");
于 2013-03-10T16:32:33.720 回答
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(), "-");
        }
    }

}
于 2013-03-10T17:03:34.740 回答