Java RegEx去除英文单词但排除部分单词

Java RegEx to remove English words but exclude some words

我尝试使用这个 RegEx (?![link]|[hashTag]|[lough])([A-Za-z0-9]+)[englishWord] 替换文本中的每个英文单词,但保留这些标签 [link]、[hashTag] 和 [lough]。 使用以下行:

 x = x.replaceAll("(?![link]|[hashTag]|[lough])([A-Za-z0-9]+)", "[englishWord]");

一个输入示例:

 BBC  The Other [lough] The kough there are [link] [hashTag]

结果输出;

 [englishWord] Th[englishWord] [englishWord] [lough] Th[englishWord] kough [englishWord] a[englishWord] [link] [hashTag]

虽然我希望输出变成:

[englishWord] [englishWord] [englishWord] [lough] [englishWord] [englishWord] [englishWord] [englishWord] [link] [hashTag]

谁能告诉我问题出在哪里?

您的正则表达式等于 (?![linkhasTgou])[A-Za-z0-9]+,它只匹配 1+ 个 ASCII 字母数字符号,但不以取反字符 class

内的字符开头

我建议使用正则表达式将这 3 个 "entities" 匹配并捕获到第 1 组中,并使用 \p{Alnum}+ 替代方法来匹配任何字母数字字符序列。然后使用 Matcher#appendReplacement() 检查第 1 组是否匹配,如果匹配,则将值重新插入到结果中,否则,替换为硬编码字符串:

String s = "BBC  The Other [lough] The kough there are [link] [hashTag]";
String p = "(\[(?:link|hashTag|lough)])|\p{Alnum}+";
Matcher m = Pattern.compile(p).matcher(s);
StringBuffer sb = new StringBuffer();
while (m.find()) {
    if (m.group(1) != null)
        m.appendReplacement(sb, m.group(1));
    else
        m.appendReplacement(sb, "[englishWord]");
}
m.appendTail(sb); 
System.out.println(sb);

Java demo

注意字符class外的[如果需要匹配文字[符号必须转义。

图案详情:

  • (\[(?:link|hashTag|lough)]) - 捕获组 1 匹配:
    • \[ - 文字 [
    • (?:link|hashTag|lough) - link 或 (|) hashTaglough
    • ] - 文字 ]
  • | - 或
  • \p{Alnum}+ - 1+ 个字母数字字符。