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