String pw="pw:(abc)";//Maybe "pw:(12)","pw:(ab123)"...
pw=pw.replaceFirst("\\(.+\\)", "*");
//pw == result:pw:*
我想要结果:pw:*****
. (abc)
必须是*
x 5
匹配内容长度的星号
我可以使用String.replaceFirst
还是String.replaceAll
唯一的方式来实现它?
String var = "lalala(pw:)()pw:(abc12)lalala()(pw:(a12)pw:() lala";
for(;;){
String oldVar= var;
var = var.replaceAll("(pw\\:\\()([*]{0,})([a-zA-Z0-9]{1})(.{1,})", "$1$2*$4");
if(oldVar.equals(var)){
break;
}
}
var = var.replaceAll("(pw\\:)\\(([*]{1,})\\)","$1*$2*");
System.out.println(var);
RESULT: lalala(pw:)()pw:*******lalala()(pw:*****pw:() lala
你可以这样做:
final String pw = "pw:(abc)";
final String anon = pw.replaceAll("[^pw:]", "*");
System.out.println(pw);
System.out.println(anon);
这将导致:
pw:(abc)
pw:*****
编辑:如果密码中包含 p/w/: 则不起作用...将尝试修复..
编辑#2:这比我想象的要难,不得不采用另一种方法:
final String input = "pw:(abc) something!";
Matcher matcher = Pattern.compile("\\(.*\\)").matcher(input);
if (matcher.find()) {
final String onlyPw = matcher.group();
final String stars = StringUtils.repeat("*", onlyPw.length());
System.out.println(input.replace(onlyPw, stars));
}
所以,首先找到由“({something})”组成的字符串。然后创建一个由该字符串中的星数组成的字符串。然后用输入中的星号替换字符串。
注意:如果密码或 ) 后面的文本包含括号,这不起作用,但是我再次怀疑你会找到一个这样做的正则表达式..
String resultString = null;
try {
Pattern regex = Pattern.compile( "pw:\\((.*?)\\)", Pattern.CANON_EQ );
Matcher regexMatcher = regex.matcher( subjectString );
if (regexMatcher.find()) {
resultString = regexMatcher.group();
return resultString.length();
}
} catch (PatternSyntaxException ex) {
// Syntax error in the regular expression
}