Ruby正则表达式\ 1对gsub意味着什么

时间:2013-04-05 04:22:43

标签: ruby regex gsub

\ 1做什么?

例如

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

我认为这与你如何使用括号有关,但我不太确定。有人可以向我解释一下吗?你可以做像\ 2这样的东西吗?如果是这样,会怎么做?

3 个答案:

答案 0 :(得分:23)

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

在你的例子中,只有一个项目被括号括起来"(bar)"项,所以你放\1的任何地方都是括号中的部分,将被交换。你可以放入\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

并替换为:

\1: \2 \1  

您也可以替换为:

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

哪个会成为:

{{1}}

答案 1 :(得分: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."

答案 2 :(得分:6)

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

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