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

Tom*_*mmy 14 ruby regex gsub

\ 1做什么?

例如

"foo bar bag".gsub(/(bar)/,'car\1')
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*mey 24

每次您在搜索部括号围绕项目将对应于若干\1,\2等等,以替代部分.

在你的例子中,只有一个项目被括号括起来,"(bar)"项目,所以你放置的任何地方\1都是括号中的部分,将被交换.你可以\1多次放入,如果你想重复这个,这很方便找到项目,所以你可以合法地写car\1\1\1,"bar"并将被交换三次.

没有用,\2因为只有一个项目被括号括起来.但是,如果你有(bar)(jar),那么\1代表"bar"\2代表"jar".

你甚至可以做这样的事情:

\1\2\1\2\2\1
Run Code Online (Sandbox Code Playgroud)

这会成为:

barjarbarjarjarbar
Run Code Online (Sandbox Code Playgroud)

这是一个真实的例子,它可以派上用场.假设你有一个这样的名单:

Jones, Tom  
Smith, Alan  
Smith, Dave  
Wilson, Bud
Run Code Online (Sandbox Code Playgroud)

你想把它改成这个:

Tom Jones  
Alan Smith  
Dave Smith  
Bud Wilson
Run Code Online (Sandbox Code Playgroud)

你可以搜索:

(.+), (.+)
Run Code Online (Sandbox Code Playgroud)

并替换为:

\2 \1
Run Code Online (Sandbox Code Playgroud)

您也可以替换为:

\1: \2 \1  
Run Code Online (Sandbox Code Playgroud)

哪个会成为:

Jones: Tom Jones  
Smith: Alan Smith  
Smith: Dave Smith  
Wilson: Bud Wilson
Run Code Online (Sandbox Code Playgroud)

  • 请花时间更好地格式化答案.Stack Overflow有一个很好的帮助系统(http://stackoverflow.com/editing-help),它描述了如何执行此操作. (3认同)

tor*_*o2k 8

一般来说\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."
Run Code Online (Sandbox Code Playgroud)


squ*_*guy 6

\1使用是在正则表达式的最后一个捕捉语法()像你说的.它说无论匹配什么,用它替换它.

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