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

Я имею регулярное выражение вида:

/(something complex and boring)?(something complex and interesting)/

Меня интересует содержимое второй круглой скобки; первые из них существуют только для обеспечения правильного соответствия (поскольку скучная часть может присутствовать или не присутствовать, но если она есть, я случайно сопоставил бы ее с регулярным выражением для интересной части).

Поэтому я могу получить доступ ко второму совпадению, используя $2. Тем не менее, для единообразия с другими регулярными выражениями, которые я использую, я хочу, чтобы как-то 1 доллар содержал содержимое второго пасетеза. Возможно ли это?

Ответы

Ответ 1

Используйте группу, не связанную с захватом:

r = /(?:ab)?(cd)/

Ответ 2

Это функция рубинового регулярного выражения. Используйте /(?:something complex and boring)?(something complex and interesting)/ (обратите внимание на ?:), чтобы достичь этого.

Кстати, в Ruby 1.9 вы можете сделать /(something complex and boring)?(?<interesting>something complex and interesting)/ и получить доступ к группе с помощью $~[:interesting];)

Ответ 3

Yup, используйте синтаксис ?::

/(?:something complex and boring)?(something complex and interesting)/

Ответ 4

Я не разработчик ruby, но я знаю другие ароматы регулярных выражений. Итак, я уверен, вы можете использовать не захватывающую группу

/(?:something complex and boring)?(something complex and interesting)/

Существует только одна группа захвата, поэтому $1

НТН

Ответ 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