(Java) Как имитировать регулярное выражение в аргументе «замена» String.replaceAll ()? - PullRequest
0 голосов
/ 03 апреля 2019

Не волнуйтесь, я не прошу вас помочь мне найти регулярное выражение!

В настоящее время я использую метод

String.replaceAll(String regex, String replacement)

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

Давайте представим, что

String rawTextInput = "Machine# 000111 
                       Password: omg333444"

Я хочу, чтобы имя пользователя было номером машины.Мой метод:

private String getUsername(String rawTextInput) {
    String username = rawTextInput.replaceAll("(.+#\\s\\d{6,6})", "(\\d{6,6})");
    return username;
}

Первый аргумент, регулярное выражение (. + # \ S \ d {6,6}) правильно идентифицирует первую строку необработанного ввода, Машина № 000111 .

Второй аргумент / регулярное выражение (\ d {6,6}) правильно изолирует нужные мне данные, 000111 .

Как правило,что этот метод говорит программе: «Найдите строку с Machine # 000111 и обрезайте эту строку до 000111 .

Фактический вывод

Однако я, очевидно, неправильно использую второй аргумент ReplaceAll (), потому что возвращаю буквальное регулярное выражение

username = "(\\d{6,6})"

Ожидаемый результат

вместо

username = "omg333444"

Как правильно получить здесь имя пользователя? Есть ли способ имитировать наличие регулярного выражения в аргументе Replace ReplaceAll ()?

Обратите внимание, что блоки кода в этом примере содержат повторяющиеся символы "\", поскольку они являются escape-символами в IntelliJ IDEA.

1 Ответ

1 голос
/ 03 апреля 2019

IntellIJ фактически делает это для опции замены.Вы можете проверить это, нажав Ctrl + R (или эквивалент на вашей платформе) и поиграв с ним.

Ответ заключается в том, что группам присваивается номер в зависимости от их положения при разборе.Например, ваш текущий Regex будет считаться одной группой, потому что есть один набор скобок, окружающих все совпадение.Если вы изолируете номера в своей отдельной группе, вы сможете использовать это в замене.Ваше новое регулярное выражение может выглядеть примерно так:

.+#\\s(\\d{6,6})

В этом случае номера изолированы в первой группе.

Группы обозначаются по их расположению и $ передэтогоТак что ваша новая замена будет выглядеть примерно так:

String username = rawTextInput.replaceAll(".+#\\s(\\d{6,6})", "$1");

Более подробная информация о символе замены находится на этой теме .

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