Java RegEx删除英文单词但排除一些单词

时间:2017-04-20 20:01:22

标签: java regex text replaceall

我尝试使用此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]

任何人都可以告诉我问题在哪里?

1 个答案:

答案 0 :(得分:1)

你的正则表达式等于(?![linkhasTgou])[A-Za-z0-9]+,它只匹配1 + ASCII字母数字符号,但不是从否定字符类中的那些符号开始

我建议使用匹配并将这3个“实体”捕获到组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

请注意,如果您需要匹配文字[符号,则必须转义字符类外的[

模式详情

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