2015-09-28 4 views
1

Работа с регулярным выражением Java, которое будет соответствовать «es» или «s» в конце строки и возвращает подстроку без этого суффикса. Кажется легким, но я не могу заставить «e» соответствовать выражению, которое я пытаюсь.Регулярное выражение: совпадение множественных случаев в конце строки

Вот результат я должен получить:

"дюймов" -> "дюйм"

"метров" -> "метр"

"унций" -> «ounc "

но с этим регулярным выражением:

Pattern.compile("(.+)(es|s)$", Pattern.CASE_INSENSITIVE); 

Я на самом деле получаю: - "+"

"дюймы"> "Инч"

После некоторых исследований я обнаружил, что часть моего поиска слишком жадная, и изменить его на это:

Pattern.compile("(.+?)(es|s)$", Pattern.CASE_INSENSITIVE); 

устраняет проблему. Мой вопрос, однако, почему «совпадение» вообще? Если «жадным» характером алгоритма была проблема, не должна ли она соответствовать целой строке?

+0

Это может быть строка за строкой, а не многострочная. Получили ли вы только один результат, или вы тоже «метнули» и «унцию»? – Derek

+0

Казалось бы, вы пытаетесь разобрать английский язык, который я не считаю обычным языком. Я думаю, вам нужно будет посмотреть на обработку естественного языка, если только вы не имеете дело с очень маленьким подмножеством слов. – npinti

+0

Взгляните на [* Greedy vs. Reuctant vs. Possessive Quantifier *] (http://stackoverflow.com/questions/5319840/greedy-vs-reluctant-vs-possessive-quantifiers). –

ответ

3

Короткий ответ

Жадный не означает possessive. Жадность стремится потреблять/потреблять как можно больше; но остановится с того момента, когда строка больше не будет соответствовать иначе.

Длинный ответ

В регулярных выражениях Клини звезда (*) жаден, это означает, что он пытается взять как можно больше, но не более. Рассмотрим регулярное выражение:

(.+)(es|s)$ 

здесь .+ стремится съесть как можно больше. Но вы можете добраться до конца регулярного выражения, когда вам как-то удается пройти (es|s), что возможно только в том случае, если он заканчивается как минимум одним s. Или, если мы выровнять строку inches:

(.+) (es|e)$ 
inche s 

(пробелы добавлены). Другими словами .+.

Когда вы делаете это не жадным, .+? пытается отказаться от еды как можно скорее. Для строки inches это после inch:

(.+?) (es|e)$ 
inch es 

Он не может отказаться от ранее, потому что тогда h должен каким-то образом должны соответствовать (es|e).

4

Когда он соответствует жадности, он соответствует столько, сколько он может, все еще встречая выражение. Поэтому, когда он жадный, он принимает все, кроме s, потому что он не может принять s и все еще встретить выражение. Когда он соответствует не жадному, он соответствует как можно меньше, сохраняя при этом выражение. Таким образом, он принимает все, кроме «es», потому что это как можно меньше, все еще встречая выражение.

Смежные вопросы