Ruby Regexp: + против *. особое поведение? - PullRequest
7 голосов
/ 24 марта 2010

Используя ruby ​​regexp, я получаю следующие результаты:

>> 'foobar'[/o+/]
=> "oo"
>> 'foobar'[/o*/]
=> ""

Но:

>> 'foobar'[/fo+/]
=> "foo"
>> 'foobar'[/fo*/]
=> "foo"

В документации сказано:
*: ноль или более повторений предыдущего
+: одно или несколько повторений предыдущего

Поэтому я ожидаю, что 'foobar' [/ o * /] вернет тот же результат, что и 'foobar' [/ o + /]

У кого-нибудь есть объяснение этому

Ответы [ 2 ]

14 голосов
/ 24 марта 2010

'foobar'[/o*/] соответствует нулю o s, которые появляются перед f, в позиции 0
'foobar'[/o+/] там не может совпадать, потому что должно быть по крайней мере 1 o, поэтомувместо этого сопоставляет все o с позиции 1

В частности, вы видите совпадения

'foobar'[/o*/] => '<>foobar'
'foobar'[/o+/] => 'f<oo>bar'

3 голосов
/ 24 марта 2010

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

Несмотря на то, что * является жадным и не привязан в начале строки, механизм регулярных выражений все равно начнет смотреть с начала строки. В случае «/ o + /» он не совпадает в позиции 0 (например, «f»), но, поскольку «+» означает один или несколько, он должен продолжать сопоставление (это не имеет ничего общего с жадностью) до совпадение найдено или все позиции оценены.

Однако в случае "/ o * /", который, как вы знаете, означает 0 или более раз, когда он не совпадает в позиции 0, механизм регулярных выражений будет корректно останавливаться в этой точке (как и должно быть, потому что o * просто означает, что o является необязательным). Существуют также соображения производительности, поскольку «o» не является обязательным, зачем тратить больше времени на его поиск?

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