0

我正在尝试实现这一点 - 如果字符串包含%25后跟任意数量的字母数字字符的模式,那么我需要替换%25%. 以下代码似乎不正确-

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

3 回答 3

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
于 2013-03-11T04:42:41.480 回答
2

你需要在这里小心。String.contains参数解释为正则表达式。

试试这个:

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

它使用反向引用仅替换捕获的模式的一部分。从文档中:

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

于 2013-03-11T04:40:56.333 回答
1
while (userPassword.contains("%25"+"[^A-Za-z0-9]*"))

应该

while (userPassword.contains("%25"+"[A-Za-z0-9]*"))
于 2013-03-11T04:39:27.673 回答