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

标签 java regex text replaceall

我尝试使用这个正则表达式(?![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 字母数字符号,但不以否定字符类内的符号开头

我建议使用正则表达式来匹配并将这 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 或 (|) hashTag洛夫
    • ] - 文字 ]
  • | - 或
  • \\p{Alnum}+ - 1+ 字母数字字符。

关于Java RegEx 删除英文单词但排除一些单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43528847/

相关文章:

java - 如何将微调器下拉值转换为整数

java - 使用 Mockito 进行单元测试将模拟类的实例变量重置为 null

java - 通过 Twitter4J 进行多线程 Twitter 访问

python - 如何使用正则表达式从 HTML 解析数据?

javascript - 如何证明 SVG 文本的合理性?

java - Hibernate 和 JDBC 在一个事务中

regex - 如何使用正则表达式在数字和字符之间进行拆分?

c - 在正则表达式中匹配正斜杠

vb.net - 高级文本搜索并将特定字符串从文件导入 VB

java - 如何格式化我的文本?