1 回答

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超3個(gè)贊
您可以收集所有重復(fù)的單詞,然后在它們前面加上_:
// Java 9+
String s = "This is a test\nAnd this is also a test\nAnd these are also tests\ntest\nЭто тест\nЭто также тест\nИ это также тесты";
String rx = "(?sU)\\b(\\w+)\\b(?=.*\\b\\1\\b)";
String[] results = Pattern.compile(rx).matcher(s).results().map(MatchResult::group).toArray(String[]::new);
System.out.println(s.replaceAll("(?U)\\b(?:" + String.join("|", results) + ")\\b", "_$0"));
// Java 8
String s = "This is a test\nAnd this is also a test\nAnd these are also tests\ntest\nЭто тест\nЭто также тест\nИ это также тесты";
String rx = "(?sU)\\b(\\w+)\\b(?=.*\\b\\1\\b)";
List<String> matches = new ArrayList<>();
Matcher m = Pattern.compile(rx).matcher(s);
while (m.find()) {
matches.add(m.group());
}
System.out.println(s.replaceAll("(?U)\\b(?:" + String.join("|", matches) + ")\\b", "_$0"));
請(qǐng)參閱在線 Java 演示和第二個(gè)片段演示。輸出:
This _is _a _test
_And this _is _also a _test
And these are _also tests
test
_Это _тест
_Это _также тест
И это _также тесты
注意,我用與 DOTALL 嵌入標(biāo)志選項(xiàng)組合替換了[\s\S]
解決方法構(gòu)造(這樣也可以匹配換行符),使用 Java 9+方法返回所有匹配項(xiàng),并根據(jù)與OR 交替運(yùn)算符連接的找到的匹配項(xiàng)構(gòu)建最終模式。.
s
.
.results()
|
細(xì)節(jié)
(?sU)\b(\w+)\b(?=.*\b\1\b)
:(?sU)
- 嵌入的 DOTALL (.
也使匹配換行符)和 UNICODE_CHARACTER_CLASS (使所有速記 Unicode 感知)標(biāo)志選項(xiàng)\b
- 字邊界(\w+)
- 第 1 組:1+ 個(gè)單詞、字符、字母、數(shù)字或_
s\b
- 字邊界(?=.*\b\1\b)
- 緊鄰右側(cè),必須有 0+ 個(gè)字符,盡可能多,后面跟有與第 1 組中相同的值作為整個(gè)單詞。(?U)\\b(?:" + String.join("|", results) + ")\\b"
:這個(gè)圖案看起來像(?U)\b(?:test|is|Это|тест|также)\b
(?U)
- 嵌入的 UNICODE_CHARACTER_CLASS 標(biāo)志選項(xiàng)\b
- 字邊界(?:test|is|Это|тест|также)
- 非捕獲交替組\b
- 字邊界
替換是_$0
第二個(gè)正則表達(dá)式,因?yàn)?code>_附加到整個(gè)匹配值$0
。
添加回答
舉報(bào)