Java String ReplaceFirst
Я читаю строку
Is Mississippi a State where there are many systems.
Я хотел бы заменить 1-ю "s" или "S" в каждом слове "t" или "T" (т.е. сохранить один и тот же случай)... так что на выходе будет:
It Mitsissippi a Ttate where there are many tystems.
Я пробовал
s= s.replaceFirst("(?i)S", "t"); [which of course didn't work]
и попытались разбить строку, используя
string [] .split(Pattern.quote("\\s"))
, а затем попытаться выяснить, как replaceFirst()
каждый элемент array
, а затем вернуть значения обратно в string
[, но не смог правильный способ сделать это].
Я думал, что \\G
может помочь перезагрузить на следующее слово, но не получил. Любая помощь, использующая эти 3 метода, оценивается.
Ответы
Ответ 1
Подход-1: Без использования методов replace
и split
для повышения производительности.
String str = "Is Mississippi a State where there are many systems.";
System.out.println(str);
char[] cArray = str.toCharArray();
boolean isFirstS = true;
for (int i = 0; i < cArray.length; i++) {
if ((cArray[i] == 's' || cArray[i] == 'S') && isFirstS) {
cArray[i] = (cArray[i] == 's' ? 't' : 'T');
isFirstS = false;
} else if (Character.isWhitespace(cArray[i])) {
isFirstS = true;
}
}
str = new String(cArray);
System.out.println(str);
EDIT: Approach2: Как вам нужно использовать метод replaceFirst
, и вы не хотите использовать StringBuilder
, вот вам вариант:
String input = "Is Mississippi a State where there are many Systems.";
String[] parts = input.split(" ");
String output = "";
for (int i = 0; i < parts.length; ++i) {
int smallSIndx = parts[i].indexOf("s");
int capSIndx = parts[i].indexOf("S");
if (smallSIndx != -1 && (capSIndx == -1 || smallSIndx < capSIndx))
output += parts[i].replaceFirst("s", "t") + " ";
else
output += parts[i].replaceFirst("S", "T") + " ";
}
System.out.println(output); //It Mitsissippi a Ttate where there are many Tystems.
Примечание. Я предпочитаю подход 1, потому что у него нет накладных расходов для метода replaceFisrt
и split
, String append
или concat
Ответ 2
Один вариант состоит в том, чтобы разделить строку на слова, а затем использовать String.replaceFirst()
для каждого слова, чтобы заменить первое вхождение s
на t
(или любую другую нужную букву):
Update:
Я реорганизовал свое решение, чтобы найти первое вхождение любого s
(верхнего или нижнего регистра) и применить к нему соответствующее преобразование.
String input = "Is Mississippi a State where there are many systems.";
String[] parts = input.split(" ");
StringBuilder sb = new StringBuilder("");
for (int i=0; i < parts.length; ++i) {
if (i > 0) {
sb.append(" ");
}
int index = parts[i].toLowerCase().indexOf('s');
if (index >= 0 && parts[i].charAt(index) == 's') {
sb.append(parts[i].replaceFirst("s", "t"));
}
else {
sb.append(parts[i].replaceFirst("S", "T"));
}
}
System.out.println(sb.toString());
Вывод:
It Mitsissippi a Ttate where there are many tystems.
Ответ 3
Используйте нижеследующую поправку к ответу Тима Бигелейсена (до редактирования его сообщения)
String input = "Is Mississippi a State where there are many systems.";
String[] parts = input.split(" ");
StringBuilder sb = new StringBuilder("");
for (String part : parts) {
sb.append(part.replaceFirst("s", "t").replaceFirst("S", "T"));
sb.append(" ");
}
System.out.println(sb.toString());
Изменить - вы можете использовать concat()
String input = "Is Mississippi a State where there are many systems.";
String[] parts = input.split(" ");
String output = "";
for (String part : parts) {
output = output.concat(part.replaceFirst("s", "t").replaceFirst("S", "T") + " ");
}
System.out.println(output);
Обновление
String input = "Is Mississippi a State where there are many Systems.";
String[] parts = input.split(" ");
//StringBuilder sb = new StringBuilder("");
String output = "";
for (String part : parts) {
output = output.concat(part.replaceFirst("s", "t") + " ");
}
String[] parts2 = output.split(" ");
output = "";
for (String part : parts2) {
output = output.concat(part.replaceFirst("S", "T") + " ");
}
System.out.println(output);
Ответ 4
Я создал метод, который -
- является общим назначением,
- не использует
replace
или split
, а
- использует только один цикл.
Ниже приведен фрагмент кода:
public static String replaceFirstOccurance(String sentence, char toChange, char changeWith) {
StringBuilder temp = new StringBuilder();
boolean changed = false;
for (int i = 0; i < sentence.length(); i++) {
if (!changed) {
if (sentence.charAt(i) == toChange) {
temp.append(changeWith);
changed = true;
} else if (sentence.charAt(i) == Character.toUpperCase(toChange)) {
temp.append(Character.toUpperCase(changeWith));
changed = true;
} else {
temp.append(sentence.charAt(i));
}
} else {
if (sentence.charAt(i) == ' ') {
changed = false;
}
temp.append(sentence.charAt(i));
}
}
return temp.toString();
}
Ответ 5
Мой метод будет в меньшей степени зависеть от тех строковых методов, о которых вы упомянули.
String phrase;
String [] parts = phrase.split(" ");
for (int i = 0; i < parts.length; i++ ) {
for (int j = 0; j < parts[i].length(); j++) {
if (parts[i].charAt(j) == 's') {
parts[i] = "t" + parts[i].substring(1);
break;
} else if (parts[i].charAt(0) == 'S') {
parts[i] = "T" + parts[i].substring(1);
break;
}
}
}
String modifiedPhrase = "";
for (int i = 0; i < parts.length; i++ ) {
modifiedPhrase += parts[i] + " ";
}
Ответ 6
Для этого есть приятное, компактное, потоковое решение:
String result = Stream.of(s.split(" "))
.map(t -> t.replaceFirst("s", "t"))
.map(t -> t.replaceFirst("S", "T"))
.collect(Collectors.joining(" "));
Ответ 7
String ss = "Is Mississippi a State where there are many systems.";
String out = "";//replaced string
for (String s : ss.split(" ")) {
int index = s.toUpperCase().indexOf('S');
out += (s.replaceFirst("[s,S]", index!= -1 && s.charAt(index) == 'S'
? "T" : "t")) + " ";
}
System.out.println(out);