Что эквивалентно .replaceSecond или .replaceThird? - PullRequest
0 голосов
/ 19 ноября 2018

В этом коде мы удаляем подстроку "luna" из строки email, используя метод .replaceFirst.Мы удаляем символы между + и @.Но это происходит только в первом случае, потому что мы использовали .replaceFirst.Что, если мы хотим нацелить второй экземпляр + и @, чтобы удалить «кузнец»?Наш вывод сейчас alice+@john+smith@steve+oliver@, но мы хотим alice+luna@john+@steve+oliver@

public class Main {

    public static void main(String[] args) {

        String email = "alice+luna@john+smith@steve+oliver@";

        String newEmail = email.replaceFirst("\\+.*?@", "");

        System.out.println(newEmail);

    }
}

Ответы [ 4 ]

0 голосов
/ 19 ноября 2018

Я думаю, что лучше заключить эту логику в отдельный метод, где String и group position - аргументы.

private static final Pattern PATTERN = Pattern.compile("([^+@]+)@");

private static String removeSubstringGroup(String str, int pos) {
    Matcher matcher = PATTERN.matcher(str);

    while (matcher.find()) {
        if (pos-- == 0)
            return str.substring(0, matcher.start()) + str.substring(matcher.end() - 1);
    }

    return str;
}

Кроме того, вы можете добавить больше методов, чтобы упростить использование этого утилиты; как removeFirst() или removeLast()

public static String removeFirst(String str) {
    return removeSubstringGroup(str, 0);
}

public static String removeSecond(String str) {
    return removeSubstringGroup(str, 1);
}

Демо-версия:

String email = "alice+luna@john+smith@steve+oliver@";
System.out.println(email);
System.out.println(removeFirst(email));
System.out.println(removeSecond(email));
System.out.println(removeSubstringGroup(email, 2));
System.out.println(removeSubstringGroup(email, 3));

Выход:

alice+luna@john+smith@steve+oliver@
alice+@john+smith@steve+oliver@
alice+luna@john+@steve+oliver@
alice+luna@john+smith@steve+@
alice+luna@john+smith@steve+oliver@

Демо Ideone

0 голосов
/ 19 ноября 2018

К сожалению, в Java нет таких методов, как замена второго, замена третьего и т.д. Это в основном замена второго. Если вы хотите заменить ТОЛЬКО второе - тогда вы можете сделать это с помощью подстрок или выполнить сопоставление с регулярным выражением и выполнить итерации по результатам.

  public static void main(String[] args) {

        String email = "alice+luna@john+smith@steve+oliver@";

        String newEmail = email.replaceFirst("\\+.*?@", "");
        newEmail = newEmail .replaceFirst("\\+.*?@", ""); //this replaces the second right? :) 
        newEmail = newEmail .replaceFirst("\\+.*?@", ""); // replace 3rd etc.

        System.out.println(newEmail);

    }
0 голосов
/ 19 ноября 2018

Можно изменить значение параметра n в следующем методе replaceNth на 2, 3, чтобы выполнить точно такую ​​же операцию, что и операция replaceSecond или replaceThird .(Примечание: этот метод может применяться к любому другому значению n. Если n-го шаблона не существует, он просто возвращает данную строку).

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

    public static String replaceNth(String str, int n, String regex, String replaceWith) {
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(str);
        while (m.find()) {
            n--;
            if (n == 0) {
                return str.substring(0,m.start() + 1)+ replaceWith + str.substring(m.end() - 1);
            }
        }
        return str;
    }

    public static void main(String args[]) {
        String email = "alice+luna@john+smith@steve+oliver@";
        System.out.println(replaceNth(email, 2, "\\+.*?@", ""));
    }
}
0 голосов
/ 19 ноября 2018

Вы можете найти второй +, например, так:

int firstPlus = email.indexOf('+');
int secondPlus = email.indexOf('+', firstPlus + 1);

(Вам нужно разобраться с тем, что нет двух + s, чтобы найти, если необходимо).

Затем найдите следующее @:

int at = email.indexOf('@', secondPlus);

Затем соедините его вместе:

String newEmail = email.substring(0, secondPlus + 1) + email.substring(at);

или

String newEmail2 = new StringBuilder(email).delete(secondPlus + 1, at).toString();

Ideone demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...