使用单个replaceAll审查选定的单词(用****代替)?

aio*_*obe 2 java regex

我想通过用“ *”替换单词中的每个字符来检查字符串中的某些单词。基本上我想做

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


更新:这是研究案例研究的一部分,其原因基本上是我想摆脱单一代码,因为它简化了生成的字节码。这不是一个严肃的网页或任何东西。

pol*_*nts 5

这是对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