\ 1做什么?
例如
"foo bar bag".gsub(/(bar)/,'car\1')
我认为这与你如何使用括号有关,但我不太确定。有人可以向我解释一下吗?你可以做像\ 2这样的东西吗?如果是这样,会怎么做?
答案 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
来继续替换您匹配的内容。