Ответ 1
Используйте группу, не связанную с захватом:
r = /(?:ab)?(cd)/
Я имею регулярное выражение вида:
/(something complex and boring)?(something complex and interesting)/
Меня интересует содержимое второй круглой скобки; первые из них существуют только для обеспечения правильного соответствия (поскольку скучная часть может присутствовать или не присутствовать, но если она есть, я случайно сопоставил бы ее с регулярным выражением для интересной части).
Поэтому я могу получить доступ ко второму совпадению, используя $2. Тем не менее, для единообразия с другими регулярными выражениями, которые я использую, я хочу, чтобы как-то 1 доллар содержал содержимое второго пасетеза. Возможно ли это?
Используйте группу, не связанную с захватом:
r = /(?:ab)?(cd)/
Это функция рубинового регулярного выражения. Используйте /(?:something complex and boring)?(something complex and interesting)/
(обратите внимание на ?:
), чтобы достичь этого.
Кстати, в Ruby 1.9 вы можете сделать /(something complex and boring)?(?<interesting>something complex and interesting)/
и получить доступ к группе с помощью $~[:interesting]
;)
Yup, используйте синтаксис ?:
:
/(?:something complex and boring)?(something complex and interesting)/
Я не разработчик ruby, но я знаю другие ароматы регулярных выражений. Итак, я уверен, вы можете использовать не захватывающую группу
/(?:something complex and boring)?(something complex and interesting)/
Существует только одна группа захвата, поэтому $1
НТН
Не совсем, нет. Но вы можете использовать именованную группу для единообразия, например:
/(?<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