我正在尝试实现这一点 - 如果字符串包含%25
后跟任意数量的字母数字字符的模式,那么我需要替换%25
为%
. 以下代码似乎不正确-
while (userPassword.contains("%25"+"[^A-Za-z0-9]*")) {
userPassword = userPassword.replace("%25", "%");
}
我正在尝试实现这一点 - 如果字符串包含%25
后跟任意数量的字母数字字符的模式,那么我需要替换%25
为%
. 以下代码似乎不正确-
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
你需要在这里小心。String.contains
不将参数解释为正则表达式。
试试这个:
userPassword = userPassword.replaceAll("%25([a-zA-Z0-9]*)", "%$1");
它使用反向引用仅替换捕获的模式的一部分。从文档中:
美元符号可以被视为对捕获的子序列的引用。
while (userPassword.contains("%25"+"[^A-Za-z0-9]*"))
应该
while (userPassword.contains("%25"+"[A-Za-z0-9]*"))