说我有这样的字符串
"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 }")
之类的事情(注意,这不起作用)
这可能吗?
答案 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 ')