[英]Ruby regex what does the \1 mean for gsub
\\ 1做什么?
例如
"foo bar bag".gsub(/(bar)/,'car\1')
我相信这与你如何使用括号有关,但我不太确定。 有人可以向我解释一下吗? 你可以做像\\ 2这样的东西吗? 如果是这样,那会怎么做?
在搜索部分中用括号括起来的每个项目将对应于替换部分中的数字\\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
一般来说\\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."
\\1
是使用()
的正则表达式中最后一次捕获的语法,就像你说的那样。 它说无论匹配什么,用它替换它。
您可以继续使用()
组及其各自的\\2
来继续替换您匹配的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.