Извлечение подстроки в Java с помощью регулярных выражений. Как включить пробелы - PullRequest
0 голосов
/ 30 июня 2018

Я извлекаю строку в JAVA, используя следующий код: Ввод (000) 000-0000111 и вывод должен быть (000) 000-0000

String text = "(000) 000-0000111";

 String pattern2 = "[(][0-9][0-9][0-9][)]\\s[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]";
 Pattern pattern_22 = Pattern.compile(pattern2);
Matcher matcher_22 = pattern.matcher(text);

if(matcher_22.find()) {

    return matcher_22.group(0);
}
else
    return "NONE";

Вывод будет "NONE", он должен быть (000) 000-0000. Куда я иду не так. Может кто-нибудь, пожалуйста, указать на это. ТИА.

Ответы [ 3 ]

0 голосов
/ 30 июня 2018

Просто замените строку шаблона на:

[^1-9]
0 голосов
/ 30 июня 2018

Ваш вопрос не компилируется. Вам нужно изменить его следующим образом

String text = "(000) 000-0000111";

String pattern2 = "[(][0-9][0-9][0-9][)]\\s[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]";
Pattern pattern_22 = Pattern.compile(pattern2);
Matcher matcher_22 = pattern_22.matcher(text);

if (matcher_22.find()) {
    return matcher_22.group(0);
} else {
    return "NONE";
}

В результате вы получите (000) 000-0000 по вашему запросу.

Тем не менее, ваше текущее регулярное выражение довольно многословно. Вы можете использовать что-то гораздо более простое, например

\(\d{3}\) \d{3}\-\d{4}

Отмечая, что в Java вы должны избегать обратной косой черты, поэтому в контексте вашего Java-кода это будет

\\(\\d{3}\\) \\d{3}\\-\\d{4}

Где \d представляет собой цифру (0-9), а {n} представляет группу n, одну за другой.

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

(\(\d{3}\) \d{3}\-\d{4})(.*)

Там, где первая группа захвата, (\(\d{3}\) \d{3}\-\d{4}) выдаст вам шаблон, который вы хотите вывести, а вторая, (.*), даст вам все остальное, что появилось после. Это также должно быть экранировано от обратной косой черты, если используется в Java.

С

pattern2 = "(\\(\\d{3}\\) \\d{3}\\-\\d{4})(.*)";

Вы бы получили

String valid = matcher_22.group(1);
String rest = matcher_22.group(2);

, где valid равно (000) 000-0000, а rest равно 111.

0 голосов
/ 30 июня 2018

Из вашего комментария:

Нет, моя цель: если input (xxx) xxx-xxxxyyy, то вывод должен быть (ххх) ххх-хххх х = любое целое число

Если вы хотите заменить последние три цифры, которые вы можете использовать:

phone = phone.replaceAll("\\d{3}$", "");

regex demo


Я не хочу его заменять, я хочу извлечь его. Есть огромный разница!

В этом случае хорошим инструментом является Pattern with Matcher, ваше регулярное выражение может быть \(\d{3}\)\s\d{3}-\d{4}:

String text = "(000) 000-0000111";

String regex = "\\(\\d{3}\\)\\s\\d{3}-\\d{4}";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
    return matcher.group();
} else {
    return "NONE";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...