我想在給定句子中用隨機單詞“$d”替換“&”。我們可以只替換那些以 & 開頭并后跟一個字符和一個空格的單詞嗎?
例子:-
輸入:-
兩個文字是 &a 和 &b 并在這里檢查 &abc 和 &bac。
輸出:-
兩個字面量是 $da 和 $db 并且在這里也檢查 &abc 和 &bac。
在上面的輸入示例中,應該替換的唯一單詞是 &a 和 &b(不應該替換完整的單詞,只有兩個單詞中的 '&')因為這兩個隨機單詞以 & 開頭,后跟一個字符和一個空格。
對于 replaceAll() 函式,當我使用正則運算式時,它會替換整個單詞:-
String str="Two literals are &a and &b and also check &abc and &bac here.";
str = str.replaceAll("\\&[a-zA-Z]{1}\\s", "\\$d");
System.out.println(str);
//output for this:-Two literals are $d and $d and also check &abc and &bac here.
//expected output:-Two literals are $da and $db and also check &abc and &bac here.
uj5u.com熱心網友回復:
正確的代碼是
str.replaceAll("&([a-zA-Z]\\s)", "\\$d$1")
這是在正則運算式中反向參考捕獲組的示例,這里是一個很好的參考。此外,這是一個相關的 StackOverflow 問題。
實質上,括號 ( [a-zA-Z]\\s) 內的匹配匹配單個字母和一個空格。這個匹配的值可以被參考,$1因為它屬于捕獲組 1。
所以我們&(a )用$d(a )(這里的括號來演示捕獲的內容)替換。感謝 u/rzwitserloot 提醒我 OP 想要 $ not &。
uj5u.com熱心網友回復:
您可能想要一個稱為前瞻的概念:您可以匹配存在的事物而無需“消耗”它。你甚至可以匹配不存在的東西。這就是你想要的: Match &[a-z],但只有向前看,我們看不到另一個字母:
for (String test : List.of("Two literals are &a and &bcd", "A literal is &a", "How about &a?")) {
System.out.println(str.replaceAll("&(?=[a-zA-Z](?![a-zA-Z]))", "\\$d"));
}
也許相反,您希望單個字母的東西只出現在任何分詞符上(即&z00不應該變成$dz00,即使 之后沒有字母z。然后我建議:
"&(?=[a-zA-Z]\\b)"
閱讀起來要簡單得多!
幾點注意事項:
(?=x)是“積極的前瞻”。它本身不匹配任何內容,但如果x不是緊跟在匹配之后,則使匹配失敗。(?!x)是“負前瞻”。它本身不匹配任何內容,但如果緊跟在匹配之后x則使匹配失敗。$在替換部分中具有特殊含義,因此我們需要對其進行轉義。\\b是“分詞”的正則運算式:不匹配任何字符,但如果我們不在“分詞”上則失敗。空格、點、輸入結束、行尾、破折號、& 符號 - 很多東西都是斷字。- 我們不想匹配這些字母,因為如果我們這樣做,它們就會被替換。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/488828.html
