我想通过用“ *”替换单词中的每个字符来检查字符串中的某些单词。基本上我想做
String s = "lorem ipsum dolor sit";
s = s.replaceAll("ipsum|sit", $0.length() number of *));
Run Code Online (Sandbox Code Playgroud)
这样结果s等于"lorem ***** dolor ***"。
我知道如何通过重复replaceAll发票来做到这一点,但是我想知道,是否可以通过单个发票来做到这一点?replaceAll
更新:这是研究案例研究的一部分,其原因基本上是我想摆脱单一代码,因为它简化了生成的字节码。这不是一个严肃的网页或任何东西。
这是对aioobe答案的修改,使用嵌套断言而不是嵌套循环来生成断言:
public static void main(String... args) {
String s = "lorem ipsum dolor sit blah $10 bleh";
System.out.println(s.replaceAll(censorWords("ipsum", "sit", "$10"), "*"));
// prints "lorem ***** dolor *** blah *** bleh"
}
public static String censorWords(String... words) {
StringBuilder sb = new StringBuilder();
for (String w : words) {
if (sb.length() > 0) sb.append("|");
sb.append(
String.format("(?<=(?=%s).{0,%d}).",
Pattern.quote(w),
w.length()-1
)
);
}
return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)
一些关键点:
StringBuilder.append 循环而不是 String +=Pattern.quote逃避任何$或\未经审查的话也就是说,这不是解决问题的最佳方法。确实,这只是一个有趣的正则表达式游戏。
我们要替换为"*",因此我们必须一次匹配一个字符。问题是哪个字符。
如果回溯足够长的时间,然后再向前看,就会看到经过审查的单词。
这是更抽象形式的正则表达式:
(?<=(?=something).{0,N})
Run Code Online (Sandbox Code Playgroud)
这与位置相匹配,使您可以回头看N字符,可以向前看something。