Использование регулярных выражений с replaceAll

#java #regex

#java #регулярное выражение

Вопрос:

У меня есть это regex , которое используется для проверки телефонных номеров.

 ^\(?(\d{2,3})\)?[-(). ]?(\d{2,3})[-(). ]?(\d{4})$
 

(Да, я знаю, что это не идеально, но мне все равно). Я просто использую его для замены телефонных номеров другой строкой, скажем ### , для удаления конфиденциальной информации. Так что ложные срабатывания — это нормально.

Это работает, когда строка, которую я ищу, является только номером телефона. Это работает:

 String PHONE_PATTERN = "^\(?(\d{2,3})\)?[-(). ]?(\d{2,3})[-(). ]?(\d{4})$";
String phone = "123-123-1234";
System.out.println(s.replaceAll(PHONE_PATTERN, "###")); //prints '###'
 

Но с окружающим текстом это не работает:

 String PHONE_PATTERN = "^\(?(\d{2,3})\)?[-(). ]?(\d{2,3})[-(). ]?(\d{4})$";
String phone = "some other text 123-123-1234";
System.out.println(s.replaceAll(PHONE_PATTERN, "###"));
 

Под не работает, я имею в виду, что текст печатается без изменений.

Что мне нужно изменить в моем регулярном выражении, чтобы заставить это работать, чтобы второй пример печатал

 some other text ###
 

Комментарии:

1. Святая мать регулярных выражений, Бэтмен.

2.Как вы в конечном итоге ^ и amp; автоматически при создании вашего регулярного выражения? Когда я пишу регулярное выражение, я должен активно думать о том, должен ли какой-либо из них быть там, например: «Нужно ли мне сопоставлять это только в начале строк / строк?»

3. @ADTC Я полный новичок, когда дело доходит до регулярных выражений. Я просто работал над тем, что нашел на этом сайте: zparacha.com /…

Ответ №1:

Удалите ^ и $ из начала и конца вашего выражения. Эти символы соответствуют началу и концу строки, но вы не хотите, чтобы номер телефона был единственным содержимым строки, поэтому их следует удалить.

Ответ №2:

Вместо якорей ^ и $ использования b (границы слова):

 String PHONE_PATTERN = "\b\(?(\d{2,3})\)?[-(). ]?(\d{2,3})[-(). ]?(\d{4})\b";
 

Ответ №3:

Вам нужно удалить привязки начала строки ^ и конца строки $ , при наличии обоих из них вы сопоставляете всю строку от первого символа в строке до последнего символа в строке.

  • Шаблон ^ должен соответствовать подстроке, начинающейся с первого символа в строке.
  • Шаблон $ должен соответствовать подстроке, заканчивающейся последним символом в строке.

Если вы хотите выполнить поиск шаблона, который находится на одном или другом конце, именно тогда вам нужно использовать якоря.