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

Posted

技术标签:

【中文标题】Ruby 正则表达式 \\1 对 gsub 意味着啥【英文标题】:Ruby regex what does the \1 mean for gsubRuby 正则表达式 \1 对 gsub 意味着什么 【发布时间】:2013-03-27 09:25:55 【问题描述】:

\1 有什么作用?

例如

"foo bar bag".gsub(/(bar)/,'car\1')

我相信这与你如何使用括号有关,但我不太确定。有人可以向我解释吗?你能做像\2这样的事情吗?如果是这样,那会做什么?

【问题讨论】:

想再重复一次 group(1)。用\1和()代表组 【参考方案1】:

您在搜索部分用括号括起来的每个项目将对应于替换部分中的一个数字\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

【讨论】:

请花时间更好地格式化您的答案。 Stack Overflow 的 a nice help system 描述了如何执行此操作。 感谢您的链接,这很有帮助。我把它清理干净了。 点击我的编辑通知上方的“已编辑”链接,看看我是如何格式化的。 看起来确实更好。您是否在前 3 段中使用内联反引号来格式化代码?我认为代码必须在单独的行上才能获得灰色突出显示的外观。感谢您帮助我加快速度;在 SO 上还是很新的。 在写问题或答案时,在线帮助中都包含了这些内容。【参考方案2】:

一般来说\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."

【讨论】:

【参考方案3】:

\1 是使用 () 的正则表达式中最后一次捕获的语法,就像你说的那样。它说任何匹配的,用那个替换它。

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

【讨论】:

你能做到\2吗?你会在哪里/如何使用它? @Tommy 当然,您只需要拥有另一个组。这个网站非常适合正则表达式问题:regular-expressions.info/named.html. 如果您曾经有过(嵌套(组))请注意,数字指的是打开括号的顺序

以上是关于Ruby 正则表达式 \1 对 gsub 意味着啥的主要内容,如果未能解决你的问题,请参考以下文章

Ruby高级编程正则

这个正则表达式 `str.gsub(/\#(.*?)/)` 有啥作用? [复制]

RegEx 替换适用于 Ruby gsub,但不适用于 sed

Ruby regex- gsub 是不是存储它匹配的内容?

ruby sub 字符串 正则表达式

Ruby 用捕获的正则表达式模式替换字符串