Простое регулярное выражение Java не работает - PullRequest
7 голосов
/ 28 октября 2010

У меня есть это регулярное выражение, которое должно удалить разделители предложений (. и ?):

sentence = sentence.replaceAll("\\.|\\?$","");

Отлично работает, конвертирует

"I am Java developer." в "I am Java developer"

"Am I a Java developer?" до "Am I a Java developer"

Но после развертывания мы обнаружили, что он также заменяет любые другие точки в предложении, когда

"Hi.Am I a Java developer?" становится "HiAm I a Java developer"

Почему это происходит?

Ответы [ 4 ]

14 голосов
/ 28 октября 2010

Труба (|) имеет самый низкий приоритет среди всех операторов. Итак, ваше регулярное выражение:

\\.|\\?$

рассматривается как:

(\\.)|(\\?$)

, который соответствует . в любом месте в строке и соответствует ? в конце строки.

Чтобы это исправить, вам нужно сгруппировать . и ? вместе как:

(?:\\.|\\?)$

Вы также можете использовать:

[.?]$

Внутри класса персонажа . и ? трактуются буквально, поэтому вам не нужно избегать их.

8 голосов
/ 28 октября 2010

То, что вы говорите с "\\.|\\?$", это «либо точка» или «знак вопроса в качестве последнего символа».

Я бы порекомендовал "[.?]$" вместо этого в порядкечтобы избежать сбивающего с толку побега (и, конечно, нежелательного результата).

7 голосов
/ 28 октября 2010

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

  • . где угодно или
  • ? в конце строки.

Вместо этого используйте класс символов:

"[.?]$"
3 голосов
/ 28 октября 2010

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

sentence = sentence.replaceAll("(\\.|\\?)$","");

Лучше всего использовать [.?]$, как предложил @Mark Byers.

sentence = sentence.replaceAll("[.?]$","");
...