Простое повторение в Ruby регулярное выражение не работает - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь выяснить, почему повторение Ruby для сопоставления с образцом не возвращает то, что, как я думаю, должно быть.

Вот самая простая версия моей проблемы:

str="Hello"

# Matches "Hello" correctly
pattern1=/[A-Z][a-z]*/
r = pattern1.match(str)
puts("[#{r}]")
# prints "[Hello]"

# Matches "e" correctly
pattern2=/[a-z]/
r = pattern2.match(str)
puts("[#{r}]")
# prints "[e]"

# Should match "ello" but doesn't
pattern3=/[a-z]*/
r = pattern3.match(str)
puts("[#{r}]")
# prints "[]"

Согласно документам , * совпадение должно быть жадным. Кажется, это не так. Что я делаю не так?

Для чего-то, grep (и PHP), похоже, ведет себя как ожидалось:

$ echo "Hello" | grep "[A-Z][a-z]*"
Hello

Я использую ruby 2.6.5p114, если что помогает.

1 Ответ

4 голосов
/ 13 января 2020

Причина этого поведения в том, что /[a-z]*/ соответствует группе символов [a-z] ноль или более раз. Метод .match соответствует первому, что он может найти.

/[a-z]*/.match("Hello")

Таким образом, будет соответствовать до "H", так как он соответствует критерию длины ноль [a-z] символов. Второе совпадение будет "ello".

"Hello".scan(/[a-z]*/) #=> ["", "ello", ""]

Возможно, вы захотите использовать квантификатор + для совпадения один или несколько раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...