繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM