Простое регулярное выражение Java не работает

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

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

он отлично работает, он преобразует

"I am Java developer." to "I am Java developer"

"Am I a Java developer?" to "Am I a Java developer"

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

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

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

4 ответов


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

\.|\?$

считается:

(\.)|(\?$)

что соответствует . в любом месте в строке и соответствует ? на конец строки.

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

(?:\.|\?)$

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

[.?]$

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


то, что вы говорите с "\.|\?$" Это "либо сроком" или "вопросительный знак как последний символ".

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


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

  • . в любом месте или
  • ? В конце строки.

использовать класс символов:

"[.?]$"

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

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

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

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