我尝试使用此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]
任何人都可以告诉我问题在哪里?
答案 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
或(|
)hashTag
或lough
]
- 文字]
|
- 或\\p{Alnum}+
- 1个以上的字母数字字符。