引用匹配字符串gsub regexp

时间:2012-03-19 14:41:15

标签: ruby-on-rails ruby regex

说我有这样的字符串

"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 个答案:

答案 0 :(得分:13)

来自gsub文档:

  

如果替换是一个字符串,它将替换匹配的字符串   文本。它可能包含对模式捕获组的反向引用   形式\ d,其中d是组号,或\ k,其中n是a   团队名字。如果它是双引号字符串,则两个反向引用都必须   之前是一个额外的反斜杠。

这意味着以下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"

答案 1 :(得分:5)

gsub占据了一个区块,对于我来说,比无块的方式更容易记住。

"some3random5string8".gsub(/\d/){|digit| digit << " "} 

答案 2 :(得分:2)

不确定ruby语法,但是:

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

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

为确保在数字和非数字(即字母或特殊字符)之间插入空格:

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

答案 3 :(得分:0)

我对ruby不是很熟悉,但我希望你可以捕获数字,然后像这样插入替换......

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