Regex заменяет шаблон первым символом совпадения и вторым символом в заглавных буквах - PullRequest
0 голосов
/ 01 февраля 2012

Допустим, у меня есть следующая строка:

"a test-eh'l"

Я хочу использовать заглавные буквы в начале каждого слова. Слово может быть разделено пробелом, апострофом, дефисом, косой чертой, точкой и т. Д. Поэтому я хочу, чтобы строка получилась так:

"A Test-Eh'L"

Я не слишком беспокоюсь о том, чтобы первый символ стал заглавным после вызова gsub, поскольку это легко сделать после факта. Тем не менее, когда я использую IRB и метод сопоставления, я, похоже, получаю только один результат. Когда я использую сканирование, оно собирает совпадения, но проблема в том, что я ничего не могу с этим поделать, так как мне нужно заменить содержимое исходной строки.

Вот что у меня есть:

"a test-eh'a".scan(/[\s|\-|\'][a-z]/)
=> [" t", "-e", "'a"]

"a test-eh'a".match(/[\s|\-|\'][a-z]/)
=> #<MatchData " t"> 

Тогда, если я попробую шаблон, используя gsub:

"a test-eh'a".gsub(/[\s|\-|\'][a-z]/, $1)
TypeError: can't convert nil into String

В javascript я обычно использовал бы круглые скобки вместо квадратных скобок в передней части. Однако при сканировании я не получал правильных результатов.

"a test-eh'a".scan(/(\s|\-|\')[a-z]/)
=> [[" "], ["-"], ["'"]] 

"a test-eh'a".gsub(/(\s|\-|\')[a-z]/, $1)
=> "a'est'h'" 

Любая помощь будет оценена.

1 Ответ

2 голосов
/ 01 февраля 2012

Попробуйте это:

"a test-eh'a".gsub(/(?:^|\s|-|')[a-z]/) { |r| r.upcase }
# => "A Test-Eh'A"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...