我想要实现这一点 - 如果一个字符串包含模式%25
后跟任意数量的字母数字字符,那么我需要用%
替换%25
。下面的代码似乎并没有成为右字符串替换在Java冒险
while (userPassword.contains("%25"+"[^A-Za-z0-9]*")) {
userPassword = userPassword.replace("%25", "%");
}
我想要实现这一点 - 如果一个字符串包含模式%25
后跟任意数量的字母数字字符,那么我需要用%
替换%25
。下面的代码似乎并没有成为右字符串替换在Java冒险
while (userPassword.contains("%25"+"[^A-Za-z0-9]*")) {
userPassword = userPassword.replace("%25", "%");
}
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
while (userPassword.contains("%25"+"[^A-Za-z0-9]*"))
应该
while (userPassword.contains("%25"+"[A-Za-z0-9]*"))
你必须要小心这里。 String.contains
确实不是将参数解释为正则表达式。
试试这个:
userPassword = userPassword.replaceAll("%25([a-zA-Z0-9]*)", "%$1");
它采用回引用仅更换摄像图案的一部分。从文档:
美元符号可能被视为对捕获的子序列的引用。
你也可以把所有这一切变成一个单一的字符串 – radai 2013-03-11 04:40:15