Подтвердить что ты не робот

String: Как заменить несколько возможных символов одним символом?

Я хотел бы заменить все '.' и ' ' на '_'

но мне не нравится мой код...

существует более эффективный способ сделать это, чем:

String new_s = s.toLowerCase().replaceAll(" ", "_").replaceAll(".","_");

?

toLowerCase() просто потому, что я хочу, чтобы он был также обрезанным...

4b9b3361

Ответ 1

String new_s = s.toLowerCase().replaceAll("[ .]", "_");

EDIT:

replaceAll использует регулярные выражения, а использование . внутри символьного класса [ ] просто распознает ., а не любой символ.

Ответ 2

s.replaceAll("[\\s\\.]", "_")

Ответ 3

Используйте String#replace() вместо String#replaceAll(), вам не нужно регулярное выражение для замены одного символа.

Я создал следующий класс, чтобы проверить, что быстрее, попробуйте:

public class NewClass {

    static String s = "some_string with spaces _and underlines";
    static int nbrTimes = 10000000;

    public static void main(String... args) {

        long start = new Date().getTime();
        for (int i = 0; i < nbrTimes; i++)
            doOne();
        System.out.println("using replaceAll() twice: " + (new Date().getTime() - start));



        long start2 = new Date().getTime();
        for (int i = 0; i < nbrTimes; i++)
            doTwo();
        System.out.println("using replaceAll() once: " + (new Date().getTime() - start2));

        long start3 = new Date().getTime();
        for (int i = 0; i < nbrTimes; i++)
            doThree();
        System.out.println("using replace() twice: " + (new Date().getTime() - start3));

    }

    static void doOne() {
        String new_s = s.toLowerCase().replaceAll(" ", "_").replaceAll(".", "_");
    }

    static void doTwo() {
        String new_s2 = s.toLowerCase().replaceAll("[ .]", "_");
    }

    static void doThree() {
        String new_s3 = s.toLowerCase().replace(" ", "_").replace(".", "_");
    }
}

Я получаю следующий вывод:

с помощью replaceAll() дважды: 100274

используя replaceAll() один раз: 24814

с помощью replace() дважды: 31642

Конечно, я не профилировал приложение для потребления памяти, это могло бы дать очень разные результаты.