在 Ruby gsub 块中使用命名的捕获组(正则表达式)

Posted

技术标签:

【中文标题】在 Ruby gsub 块中使用命名的捕获组(正则表达式)【英文标题】:Using named capture groups inside Ruby gsub blocks (regex) 【发布时间】:2013-05-10 20:40:45 【问题描述】:

我正在尝试在 Ruby 的块内使用命名的捕获组。 $1 仍然有效,但我想使用我提供的名称来引用它。

"foo /(bar)".gsub(/(?<my_word> \(.*?\) )/x) do |match|
  puts "$1 = #$1 and $my_word = #$my_word"
end

预期:$1 = (bar) and $my_word = (bar)

【问题讨论】:

【参考方案1】:

你正在寻找

"foo /(bar)".gsub(/(?<my_word> \(.*?\) )/x) do |match|
  puts "$1 = #$1 and $my_word = #$~[:my_word]"
end

【讨论】:

太好了,谢谢。我以前从未见过这样的语法。 你能给我一个好的正则表达式教程链接吗?我知道zero 关于regex。 :( 您是否有理由需要\(.*?\) 中的??在我的理解中,这就是说“任何字符的零个或多个,零个或多个”,这似乎与“任何字符的零个或多个”相同,即\(.*\) @acobster 我写这篇文章已经有一段时间了,但我相信这是为了防止它在第一对之后捕获括号中的内容。即(foo)(bar) 中的“栏”。如果它是贪婪的,它会从最左边开始并捕获所有内容,直到最后一个括号。 $~ 等价于Regexp.last_match

以上是关于在 Ruby gsub 块中使用命名的捕获组(正则表达式)的主要内容,如果未能解决你的问题,请参考以下文章

Ruby高级编程正则

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

具有多个捕获组的 R 中的正则表达式组捕获

具有命名捕获支持的 Ruby 正则表达式匹配枚举器

使用 re.findall 在正则表达式中捕获命名组

Python:使用JSON API链接通过正则表达式显示命名捕获组