Замена последнего символа, указанного в строке

У меня есть строка в 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

Вы можете сделать следующее:

  1. Удалите последний ",", так что вы останетесь с A, B, C, D
  2. Заменить последние "," на "и" Результатом являются 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

Я не проверял этот код. Но ты получил идею.

"A, B, C, D, ".replace(", D, ", " 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

И так далее.

Другие вопросы по тегам