14

\1 有什么作用?

例如

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

我相信这与你如何使用括号有关,但我不太确定。有人可以向我解释吗?你能做像\2这样的事情吗?如果是这样,那会做什么?

4

3 回答 3

26

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

在您的示例中,只有一个项目被括号包围,该"(bar)"项目,因此您放置 a\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
于 2013-04-05T04:30:22.173 回答
9

一般\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."
于 2013-04-05T09:05:36.357 回答
6

使用您所说\1的那样,正则表达式中最后一次捕获的is 语法。()它说任何匹配的,用那个替换它。

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

于 2013-04-05T04:24:07.557 回答