例如我有两个字符串
String a="aaabbbaaa";
String b="bbb";
我需要替换字符串 a 中的所有字符,字符串 b 除外
我需要下一个结果(例如,我们用“+”替换所有“a”字符):+++bbb+++
为此,我总是使用外部库:Apache-Commons-Lang。在这个包中,您有大量经过良好测试和精心设计的字符串操作方法。
String a="aaabbbaaa";
String b="bbb";
String newA = "";
int i = 0;
while (i < a.indexOf(b)) {
newA += "+";
i++;
}
newA +=b;
i = a.lastIndexOf(b);
while (i < a.length()) {
newA += "+";
i++;
}
System.out.println(newA);
@Shreyas Dave非常简单的解决方案的改进版本:
String myReplace(String a, String b, char substitute) {
final StringBuilder result = new StringBuilder(a.length());
int i = 0;
int pos = -1;
while ((pos = a.indexOf(b, pos + 1)) >= 0) {
for (; i < pos; ++i) {
result.append(substitute);
}
result.append(b);
i += b.length();
}
for (; i < a.length(); ++i) {
result.append(substitute);
}
return result.toString();
}
至少这有效:
String a = "axabbbababbbbbbbbb";
String b = "bbb";
StringBuilder result = new StringBuilder(a.length());
for (int i = 0, alen = a.length(), blen = b.length(), last = alen - blen + 1; i < alen; i++) {
if (i < last && b.equals(a.substring(i, i + blen))) {
result.append(b);
i += blen - 1;
}
else {
result.append('+');
}
}
System.out.println(result);
使用正则表达式,您可以执行以下操作:
public static String plussify(String data, String words) {
return (" " + data).replaceAll(".((?:"+words+")+)?", "+$1").substring(1);
}
需要添加空格前缀来满足字符串以不被替换的单词开头的极端情况。如果这永远不会发生,那么您所需要的就是replaceAll
. 该words
字符串在正则表达式中使用,因此需要相应地进行转义和清理。的语法words
适用bbb
于单个字符串或bbb|d|ff
多个字符串(bbb
,d
和ff
)。
正则表达式的工作原理是使用单个字符并将其+
替换+
为+
列入白名单的词。
例子:
System.out.println(plussify("daaabbbffffbbabbd","bbb|d|ff"));
output: d+++bbbffff+++++d
鉴于我们知道该字符串不以任何列入白名单的单词开头:
System.out.println("aaabbbaaa".replaceAll(".((?:bbb)+)?", "+$1"));
output: +++bbb+++