删除所有非单词字符除外&& 或'或 图案

Wat*_*att 9 java regex

我试图清除所有非单词字符的字符串,除非它是&即模式可能是 &[\w]+;

例如:

abc; => abc
abc & => abc &
abc& => abc  
Run Code Online (Sandbox Code Playgroud)

如果我使用string.replaceAll("\W","") 它删除;,并'&'从中我不希望第二个例子太多.

可以在这个问题中使用负面预测可以快速解决正则表达式模式吗?

Roh*_*ain 2

首先,我真的很喜欢这个问题。现在,你想要的不能用单个来完成replaceAll,因为为此,我们需要一个negative look-behind可变长度,这是不允许的。如果允许的话,事情就不会那么困难了。

无论如何,由于replaceAll这里没有单身选项,因此您可以在这里使用一些技巧。semi-colon就像首先用一些字符序列替换你的最后一个entity reference,你确信它不会出现在字符串的其余部分,比如XXX或任何东西。我知道这是不正确的,但你确实无能为力。

所以,您可以尝试以下方法:

String str = "a;b&c &";

str  = str.replaceAll("(&\\w+);", "$1XXX")
          .replaceAll("&(?!\\w+?XXX)|[^\\w&]", "")
          .replaceAll("(&\\w+)XXX", "$1;");

System.out.println(str);
Run Code Online (Sandbox Code Playgroud)

解释:

  • &第一个 ReplaceAll 替换类似with 的模式&ampXXX,或替换为 last 的任何其他序列;
  • 第二个replaceAll,替换任何&后面没有\\w+XXX, 或任何non-word, non &字符。这将替换所有不属于某种模式&'s的部分。&另外,还可以替换任何其他非单词字符。
  • 第三个replaceAll,重新替换XXX;,以创建&回来&ampXXX

为了使其更容易理解,您可以使用PatternMatcher类,并且每当替换标准很复杂时我总是更喜欢使用它们。

String str = "a;b&c &";

Pattern pattern = Pattern.compile("&\\w+;|[^\\w]");
Matcher matcher = pattern.matcher(str);

StringBuilder sb = new StringBuilder();

while (matcher.find()) {
    String match = matcher.group();
    if (!match.matches("&\\w+;")) {
        matcher.appendReplacement(sb, "");
    } else {
        matcher.appendReplacement(sb, match);
    }
}
matcher.appendTail(sb);
System.out.println(sb.toString());
Run Code Online (Sandbox Code Playgroud)

这与 @Eric 的代码类似,但是对其的概括。当然,只有经过&改进以删除NullPointerException其中的内容后,该功能才会起作用。