样品串
astabD(tabD)tabD .tabD tabD。 (tabD tabD)
对于上述字符串中除第一个和第二个字符串之外的所有字符串,我都需要用temp.tabD
代替tabD。
为此,我尝试了用单词边界替换全部
str.replaceAll(“ \ b” +“ tabD” +“ \ b”,“ temp.tabD
”))
除第二次出现外,均有效。希望对您有所帮助,因为'('和')'也是关键字,只有两者的出现都必须忽略。
最佳答案
您可以使用
.replaceAll("\\b(?<!\\((?=\\w+\\)))tabD\\b", "")
或者,如果
tabD
来自用户输入:String s = "astabD (tabD) tabD .tabD tabD. (tabD tabD)";
String word = "tabD";
String wordRx = Pattern.quote(word);
s = s.replaceAll("(?<!\\w)(?<!\\((?=" + wordRx + "\\)))" + wordRx + "(?!\\w)", "");
请参见regex demo。
细节
\b
-单词边界((?<!\w)
是明确的左单词边界)(?<!\((?=\w+\)))
-如果在当前位置的正前方有一个(
,其后跟一个1个以上的字符字符(匹配\w+
的单词需要tabD
)和一个)
(注意:如果您的IDE告诉您+
位于后向内部,则这是IDE错误,因为+
在此处处于先行状态,并且允许+
/ *
限定词在前面)tabD
-要查找的单词\b
-单词边界((?!\w)
是明确的右单词边界)Java demo:
String s = "astabD (tabD) tabD .tabD tabD. (tabD tabD)";
System.out.println(s.replaceAll("\\b(?<!\\((?=\\w+\\)))tabD\\b", ""));
// => astabD (tabD) . . ( )