2016-11-03 5 views
2

Я хотел бы заменить первую букву после дефиса в строке с заглавной буквой.Ruby Regexp gsub, заменить экземпляры второго совпадающего символа

«это-это-строка» должна стать «thisIsAString»

"this-is-a-string".gsub(/[-]\w/, '\1'.upcase) 

Я надеялся, что \ 1 будет снова вставить свой второй матч символ \ ш и что я мог бы заработать его.

Как использовать параметры \ 0 \ 1 и т. Д.?

+0

Но вы не захватили '\ w'. –

+1

Простите меня, я очень новичок в ruby ​​и regexp - что вы подразумеваете под захватом? – rus64

+0

Любая часть шаблона, заключенная в пару неотбеленных круглых скобок, формирует группу захвата. Подробнее о * захвате групп * в разделе [* Использование круглых скобок для группировки и захвата *] (http://www.regular-expressions.info/brackets.html) в файле regular-expressions.info. –

ответ

3

Вам необходимо убрать \w, чтобы иметь возможность обратиться к отправке.

Использование

"this-is-a-string".gsub(/-(\w)/) {$~[1].upcase} 
# => thisIsAString 

См Ruby demo

Обратите внимание, что $~[1] внутри {$~[1].upcase} блок на самом деле текст захватил с (\w), то $~ является объектом matchdata экземпляр с gsub и [1] является индексом из первая группа, определенная с помощью пары неизолированных скобок.

Подробнее об группы по захвату в разделе Use Parentheses for Grouping and Capturing на регулярной основе.

+0

Спасибо за ответ. Таким образом, заключенные скобки захватывают \ w. Что такое '$ ~ [1]'? – rus64

+0

'$ ~' - объект matchdata, см. Https://ruby-doc.org/core-2.2.0/MatchData.html. Индекс позволяет получить доступ к первому содержимому группы захвата. 0-й индекс - это весь матч. –

+0

Очень полезно, спасибо большое. – rus64