replaceAll в java дает неправильный вывод

replaceAll дает неправильный вывод для следующего кода: -

package javaapplication3;

public class JavaApplication3
{
    public static void main(String[] args)
    {
        try
        {
            String sa = "LTD.";
            sa = sa.replaceAll("L.","LE");
            sa = sa.replaceAll("LTD.","LTD&#8901");
            System.out.println(sa);
        }
        catch (Exception e)
        {
            System.out.println(e);
        }
    }

}

Вывод должен быть: LTD⋅

Но вывод показывает: LED.


person user567679    schedule 04.09.2016    source источник
comment
ReplaceAll использует регулярное выражение. . Это любой символ, чтобы не было ошибки. Работает как задумано. Вы можете использовать replaceFirst, если вам не нужно регулярное выражение   -  person YMomb    schedule 04.09.2016


Ответы (2)


replaceAll принимает регулярное выражение в качестве первого аргумента. В регулярном выражении . соответствует любому одиночному символу, поэтому в первом операторе replaceAll LT заменяется на LE. Вы можете исправить это, экранировав . с помощью \\.

 sa = sa.replaceAll("L\\.","LE");
 sa = sa.replaceAll("LTD\\.","LTD&#8901");

Дополнительная информация о регулярном выражении Java: https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

Скомпилируйте и запустите этот код здесь.

person js441    schedule 04.09.2016
comment
Любая причина для понижения? Этот ответ должен работать. - person js441; 04.09.2016

Выход в порядке.

public static void main(String[] args) {
    String sa = "LTD.";
    sa = sa.replaceAll("L.", "LE"); // in regex . means any single character. So, "LT" is replaced. "LTD." is now "LED."
    sa = sa.replaceAll("LTD.", "LTD&#8901"); // "LED." doesn't have "LTD.". so no replace
    System.out.println(sa); // output "LED."
}

Вместо этого используйте replace().

public static void main(String[] args) {
    String sa = "LTD.";
    sa = sa.replace("L.", "LE");
    sa = sa.replace("LTD.", "LTD&#8901");
    System.out.println(sa);
}
person Shahid    schedule 04.09.2016
comment
Так не пойдет. replace принимает символ, а не строку. Если вы хотите заменить строку, вам придется использовать replaceAll и правильно отформатировать регулярное выражение. - person js441; 04.09.2016
comment
@ js441 есть несколько перегруженных методов replace. Существует replace(char, char), как вы упомянули, но есть также replace(String, String), который в основном представляет собой версию replaceAll(String, String), которая автоматически экранирует синтаксис регулярных выражений. - person Pshemo; 04.09.2016
comment
@Pshemo, только что понял, что есть замена (CharSequence, CharSequence). Который может быть неявно создан из строкового литерала. Так что replace(String, String) будет работать. - person js441; 04.09.2016