我正在使用正则表达式检查字符串的正确性(我想允许字符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
?
答案 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(), "-");
}
}
}