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);
注意字符class外的[
如果需要匹配文字[
符号必须转义。
图案详情:
(\[(?:link|hashTag|lough)])
- 捕获组 1 匹配:
\[
- 文字 [
(?:link|hashTag|lough)
- link
或 (|
) hashTag
或 lough
]
- 文字 ]
|
- 或
\p{Alnum}+
- 1+ 个字母数字字符。
我尝试使用这个 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);
注意字符class外的[
如果需要匹配文字[
符号必须转义。
图案详情:
(\[(?:link|hashTag|lough)])
- 捕获组 1 匹配:\[
- 文字[
(?:link|hashTag|lough)
-link
或 (|
)hashTag
或lough
]
- 文字]
|
- 或\p{Alnum}+
- 1+ 个字母数字字符。