Regexp в ruby — могу ли я использовать круглые скобки без группировки?

#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