#ruby #regex
#ruby #регулярное выражение
Вопрос:
У меня есть регулярное выражение вида:
/(something complex and boring)?(something complex and interesting)/
Меня интересует содержимое второй круглой скобки; первые указаны там только для обеспечения правильного соответствия (поскольку скучная часть может присутствовать, а может и не присутствовать, но если она есть, я случайно сопоставлю ее с регулярным выражением для интересной части).
Таким образом, я могу получить доступ ко второму совпадению, используя 2 доллара. Однако для единообразия с другими регулярными выражениями, которые я использую, я хочу, чтобы каким-то образом $ 1 содержал содержимое второго паретеза. Возможно ли это?
Комментарии:
1. Спасибо всем за быстрый и понятный ответ!
Ответ №1:
Используйте группу без захвата:
r = /(?:ab)?(cd)/
Ответ №2:
Это функция регулярного выражения, отличная от ruby. Используйте /(?:something complex and boring)?(something complex and interesting)/
(обратите ?:
внимание на) для достижения этой цели.
Кстати, в Ruby 1.9 вы можете сделать /(something complex and boring)?(?<interesting>something complex and interesting)/
и получить доступ к группе с помощью $~[:interesting]
😉
Ответ №3:
Да, используйте ?:
синтаксис:
/(?:something complex and boring)?(something complex and interesting)/
Ответ №4:
Я не разработчик ruby, однако я знаю другие варианты регулярных выражений. Держу пари, вы можете использовать группу без захвата
/(?:something complex and boring)?(something complex and interesting)/
Существует только одна группа захвата, следовательно, 1 доллар
HTH
Ответ №5:
Не совсем, нет. Но вы можете использовать именованную группу для единообразия, например:
/(?<group1>something complex and boring)?(?<group2>something complex and interesting)/
Вы можете изменить имена (текст в угловых скобках) для единообразия, которого вы хотите достичь. Затем вы можете получить доступ к группам следующим образом:
string.match(/(?<group1>something complex and boring)?(?<group2>something complex and interesting)/) do |m|
# Do something with the match, m['group'] can be used to access the group
end