我尝试使用这个正则表达式(?![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/