Замена последнего символа, указанного в строке
У меня есть строка в Java:
String text = "A, B, C, D, ";
Как я могу получить "A, B, C and D"
?
У меня также есть "A, B, C, D": text.substring(0, text.lastIndexOf(",")), но как мне получить желаемый результат?
Спасибо!!!
6 ответов
Как насчет чего-то вроде
text = text.replaceAll(", (\\w+), $", " and $1");
replaceAll
использует регулярное выражение в качестве первого параметра и может использовать части, совпадающие с этим регулярным выражением, вместо $x
где x
относится к части, соответствующей номеру группы x
(Короче говоря, группы - это части или регулярные выражения из скобок).
Так что это регулярное выражение будет соответствовать , oneOrMoreCharacters,
который находится прямо перед концом строки, которая в регулярном выражении может быть представлена с $
,
DEMO:
System.out.println("A, B, C, D, ".replaceAll(", (\\w+), $", " and $1"));
выход: A, B, C and D
РЕДАКТИРОВАТЬ
Если твой D
часть может также содержать не алфавитно-цифровые символы, то вместо \\w
использование [^,]
который представляет все символы, кроме ,
, Так что попробуйте с
text = text.replaceAll(", ([^,]+), $", " and $1");
Вы можете попробовать что-то вроде следующего:
String text = "A, B, C, D, ";
String[] a=text.split(",");
int i=a.length-1;
while(i>=0 && (a[i]==null || a[i].trim().isEmpty()))
i--;
System.out.println(a[i]);
String text = "A, B, C, D, ";
String[] split=text.split(",");
String ans="";
for(int i=0;i<split.length;i++){
if(i==split.length-2){
ans+= "and "+ split[i].replace(" ","");
break;
}
if(i>0){
ans+=", ";
}
ans+=split[i];
}
System.out.println(ans); // what you wanted
Вы можете сделать следующее:
- Удалите последний ",", так что вы останетесь с A, B, C, D
- Заменить последние "," на "и" Результатом являются A, B, C и D.
Вы можете сделать это с помощью StringBuilder:
String myStr = "A, B, C, D,";
StringBuilder builder = new StringBuilder(myStr);
builder.replace(builder.lastIndexOf(","), builder.lastIndexOf(",")+1, "");
builder.replace(builder.lastIndexOf(","), builder.lastIndexOf(",")+1, " and ");
String result = builder.toString();
System.out.println(result);//Should print A, B, C and D
Я не проверял этот код. Но ты получил идею.
Похоже, вы используете код как
List<String> list = Arrays.asList("A", "B", "C", "D");
String text = "";
for (String token : list) {
text += token + ", ";
}
System.out.println(text);
создать свой text
значение.
Вместо этого напишите первое значение. Затем напишите все, кроме последнего значения. Затем напишите последнее значение с and
предваряется.
List<String> list = Arrays.asList("A", "B", "C", "D");
String text = "";
if (!list.isEmpty()) {
text += list.get(0);
for (int i = 1; i < list.size() - 1; i++) {
text += ", " + list.get(i);
}
if (list.size() > 1)
text += " and " + list.get(list.size() - 1);
}
System.out.println(text);
Очевидно, использовать StringBuilder
при необходимости. Вышеуказанные принты
A, B, C and D
Прелесть этого в том, что он работает с любым количеством значений, выполняя наименьшее возможное количество проверок на наличие длин и токенов. С одним элементом будет напечатано только это значение
A
С двумя элементами (A и B), это напечатало бы
A and B
И так далее.