【发布时间】:2023-03-30 23:49:01
【问题描述】:
\1 有什么作用?
例如
"foo bar bag".gsub(/(bar)/,'car\1')
我相信这与你如何使用括号有关,但我不太确定。有人可以向我解释吗?你能做像\2这样的事情吗?如果是这样,那会做什么?
【问题讨论】:
-
想再重复一次 group(1)。用\1和()代表组
\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 来继续替换您匹配的内容。
【讨论】: