совпадения ссылок в строке gsub regexp - PullRequest
4 голосов
/ 19 марта 2012

Скажи, что у меня есть такая строка

"some3random5string8"

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

"some3 random5 string8"

Я специально хочу сделать это, используя gsub, но я не могу понять, как получить доступ к символам, которые соответствуют моему регулярному выражению.

Например:

temp = "some3random5string8"
temp.gsub(/\d/, ' ')  # instead of replacing with a ' ' I want to replace with
                      # matching number and space

Я надеялся, что есть способ сослаться на совпадение с регулярным выражением. Что-то вроде $1, чтобы я мог сделать что-то вроде temp.gsub(/\d/, "#{$1 }") (заметьте, это не работает)

Возможно ли это?

Ответы [ 4 ]

13 голосов
/ 19 марта 2012

Из gsub документов:

Если замена - это строка, она будет заменена на соответствующую текст. Может содержать обратные ссылки на группы захвата шаблона вида \ d, где d это номер группы, или \ k, где n это номер имя группы. Если это строка в двойных кавычках, обе обратные ссылки должны должен предшествовать дополнительный обратный слеш.

Это означает, что следующие 3 версии будут работать

>> "some3random5string8".gsub(/(\d)/, '\1 ')
=> "some3 random5 string8 "
>> "some3random5string8".gsub(/(\d)/, "\\1 ")
=> "some3 random5 string8 "
>> "some3random5string8".gsub(/(?<digit>\d)/, '\k<digit> ')
=> "some3 random5 string8 "

Редактировать: также, если вы не хотите добавлять дополнительный пробел в конце, используйте отрицательный прогноз на конец строки, например ::

>> "some3random5string8".gsub(/(\d(?!$))/, '\1 ')
=> "some3 random5 string8"

Положительная проверка «слова» также бы сработала:

>> "some3random5string8".gsub(/(\d(?=\w))/, '\1 ')
=> "some3 random5 string8"

Последняя, ​​но не менее важная версия, без пробела в конце:

>> "some3random5string8".gsub(/(\d)(\w)/, '\1 \2')
=> "some3 random5 string8"
5 голосов
/ 19 марта 2012

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

"some3random5string8".gsub(/\d/){|digit| digit << " "} 
2 голосов
/ 19 марта 2012

Не уверен насчет синтаксиса ruby, но:

temp.gsub(/(\d)/, '$1 ')

или

temp.gsub(/(\d)/, '\1 ')

Чтобы убедиться, что вы вставляете пробел между числом и не числом (то есть буквой или специальным символом):

temp.gsub(/(\d)(\D)/, '$1 $2')
0 голосов
/ 19 марта 2012

Я не очень знаком с рубином, но я думаю, что вы можете захватить цифру, а затем вставить в замен, как это ...

temp.gsub(/(\d)/, '$1 ')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...