Простое регулярное выражение 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("[.?]$","");