2013-04-05 49 views
13

\ 1做了什么?Ruby正则表达式 1对于gsub来说意味着什么

例如

"foo bar bag".gsub(/(bar)/,'car\1') 

我相信这是与你如何使用括号,但我真的不知道。有人可以向我解释吗?你能做些像2的东西吗?如果是这样,那会做什么?

+0

要重复基团(1)的另一时间。使用\ 1和()代表组 – Civa 2013-04-05 04:27:02

回答

6

\1是正如您所说的使用()的正则表达式中最后捕获的语法。它说什么是匹配的,用它代替它。

您可以继续使用()组及其各自的\2继续替换您匹配的内容。

+0

你可以做2吗?你在哪里/如何使用它? – Tommy 2013-04-05 04:25:35

+0

@Tommy当然,你只需要另一组。这个网站非常适合正则表达式问题:http://www.regular-expressions.info/named.html。 – squiguy 2013-04-05 04:26:40

+0

ahh明白了,谢谢 – Tommy 2013-04-05 04:29:12

20

您在搜索部分用圆括号括起来的每个项目将对应于替换部分中的数字\1,\2等。

在你的榜样,有那么任何地方,你把\1是在括号内的部分,将被交换的只有一个项目由括号包围的"(bar)"项目,你可以把在\1多次,这是方便如果你想重复发现的项目,所以你可以合法地写car\1\1\1"bar"将交换三次。

对于\2没有用处,因为只有一个项目被圆括号包围。但是,如果您有(bar)(jar),那么\1将代表"bar"\2将代表"jar"

你甚至可以做这样的事情:

\1\2\1\2\2\1 

这将成为:

barjarbarjarjarbar 

这里有一个真实的例子,其中该派上用场了。比方说,你有一个名单如下:

Jones, Tom 
Smith, Alan 
Smith, Dave 
Wilson, Bud 

,你想把它改成这样:

Tom Jones 
Alan Smith 
Dave Smith 
Bud Wilson 

你可以搜索:

(.+), (.+) 

,并替换为:

\2 \1 

你也可以替换w第i:

\1: \2 \1 

这将成为:

Jones: Tom Jones 
Smith: Alan Smith 
Smith: Dave Smith 
Wilson: Bud Wilson 
+3

请花时间更好地设置你的答案格式。 Stack Overflow有一个很好的帮助系统(http://stackoverflow.com/editing-help),它描述了如何做到这一点。 – 2013-04-05 05:40:46

+0

感谢您的链接,帮助。我把它清理干净了。 – 2013-04-06 16:34:14

+0

看看我是如何通过点击编辑通知上方的“编辑”链接来对其进行格式化的。 – 2013-04-08 01:48:27

7

一般来说\N被替换为在正则表达式中指定的第N个组。第一个匹配组由\1引用,组的最大数量为9。

一些例子:

# wrap every integer into brackets 
'1 2 34'.gsub(/(\d+)/, '[\1]') 
# => "[1] [2] [34]" 

# gsub with two groups: swap couples of integers 
'<1,2> <3,4>'.gsub(/(\d+),(\d+)/, '\2,\1') 
# => "<2,1> <4,3>" 

# you can reference the same group more than once 
'1 2 34'.gsub(/(\d+)/, '<\1,\1>') 
# => "<1,1> <2,2> <34,34>" 

# a slightly more complex example 
'Jim Morrison'.sub(/([A-Z])[a-z]+ ([A-Z][a-z]+)/, '\2 \1.') 
# => "Morrison J." 
相关问题