2012-03-19 62 views
3

说我有这样的参考匹配

"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 }")(注意,这不起作用)

这可能吗?

回答

11

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" 
+0

我实际上用''some3random5string8”.gsub(/(\ d)/,'\ 1').rstrip'去,因为那样更容易让我明白。谢谢你的伟大答案。 – Dty 2012-03-20 05:24:14

2

不知道关于Ruby语法,但是:

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

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

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

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

帽尖...,〜) – 2012-03-19 14:45:58

+0

+1不错后一个工作... – abhijit 2012-03-19 14:54:42

+0

抱歉,但在Ruby 1.9的至少'$'版本似乎不工作。试用单引号和双引号。 – Dty 2012-03-20 05:26:32

0

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

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

'$ 1 +'''确实有效('$ 1'只是一个字符串)。 – steenslag 2012-03-19 15:47:20

+0

我期望''$ 1“'(带双引号)也可以工作...... – 2012-03-20 00:32:57

4

gsub需要一个块,这对我来说是很容易,获得本场比赛的块,少的方式来记住。

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

对我的口味有点过于冗长,但感谢教我一些有用的知识! – Dty 2012-03-20 05:21:01