Очень странная проблема с Ruby и регулярным выражением - PullRequest
3 голосов
/ 15 февраля 2010

Я получаю совершенно разные результаты от string.scan и нескольких тестеров регулярных выражений ...

Я просто пытаюсь извлечь домен из строки, это последнее слово.

Регулярное выражение в вопросе:

/([a-zA-Z0-9\-]*\.)*\w{1,4}$/

Строка (1 строка, проверенная в среде выполнения Ruby)

str = 'Show more results from software.informer.com'

Работает нормально, но в рубине ....

irb(main):050:0> str.scan /([a-zA-Z0-9\-]*\.)*\w{1,4}$/
=> [["informer."]]

Я бы подумал, что получу совпадение на software.informer.com, и это моя цель.

Ответы [ 4 ]

3 голосов
/ 15 февраля 2010

Ваше регулярное выражение верное, результат связан с тем, как ведет себя сканирование String #. С официальная документация :

"Если шаблон содержит группы, каждый отдельный результат сам является массивом, содержащим одну запись на группу."

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

2 голосов
/ 15 февраля 2010

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

'Show more results from software.informer.com'[ /([a-zA-Z0-9\-]*\.)*\w{1,4}$/ ]
#=> "software.informer.com"

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

'foo.bar.baz lala software.informer.com'.scan( /(?:[a-zA-Z0-9\-]*\.)*\w{1,4}/ )
#=> ["foo.bar.baz", "lala", "software.informer.com"]
2 голосов
/ 15 февраля 2010

Вы получаете совпадение на software.informer.com. Проверьте значение $&. Возвращаемое значение scan представляет собой массив захваченных групп. Добавьте захватные скобки вокруг суффикса, и вы получите .com как часть возвращаемого значения из scan.

Тестировщики регулярных выражений и Ruby не расходятся во мнениях по поводу фундаментальной проблемы (само регулярное выражение). Скорее, их интерфейсы отличаются тем, что они подчеркивают. Когда вы запускаете scan в irb, первое, что вы увидите, это возвращаемое значение из scan (массив захваченных подшаблонов), что не совпадает с соответствием текст. Тестеры Regex, скорее всего, ориентированы на отображение сопоставленного текста.

0 голосов
/ 15 февраля 2010

Как насчет этого:

/([a-zA-Z0-9\-]*\.*\w{1,4})$/

Возвращает

informer.com

На вашей тестовой строке.

http://rubular.com/regexes/13670

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