2013-03-11 38 views
0

我想要实现这一点 - 如果一个字符串包含模式%25后跟任意数量的字母数字字符,那么我需要用%替换%25。下面的代码似乎并没有成为右字符串替换在Java冒险

while (userPassword.contains("%25"+"[^A-Za-z0-9]*")) { 
    userPassword = userPassword.replace("%25", "%"); 
} 

回答

3

String.contains()不使用正则表达式的工作,但与简单的文本,所以你实际上是在看确切序列的方法“%25 [^ A-ZA-Z0-9]”你的字串。此外,^意味着它应该匹配不在字符类中的字符,也就是不包含字母数字字符,这与您想要的相反。

您可以改为使用方法String.matches

while (userPassword.matches(".*%25[A-Za-z0-9]*")) 

(正如你看到的,我把所有的正则表达式在一个字符串,编译器将这样做,是为你,但它更清楚。)

例如:

String userPassword = "%25sdflk42"; 

System.out.println(userPassword.contains("%25"+"[A-Za-z0-9]*")); 
System.out.println(userPassword.matches(".*%25[A-Za-z0-9]*")); 

这将打印:

false 
true 
1
while (userPassword.contains("%25"+"[^A-Za-z0-9]*")) 

应该

while (userPassword.contains("%25"+"[A-Za-z0-9]*")) 
+1

你也可以把所有这一切变成一个单一的字符串 – radai 2013-03-11 04:40:15

2

你必须要小心这里。 String.contains确实不是将参数解释为正则表达式。

试试这个:

userPassword = userPassword.replaceAll("%25([a-zA-Z0-9]*)", "%$1"); 

它采用回引用仅更换摄像图案的一部分。从文档:

美元符号可能被视为对捕获的子序列的引用。