Ruby正则表达式- gsub仅捕获组

wlwcrazw  于 2022-11-22  发布在  Ruby
关注(0)|答案(7)|浏览(199)

我不太确定我是否理解非捕获组是如何工作的。我正在寻找一个正则表达式来产生这个结果:5.214。我原以为下面的正则表达式可以工作,但它替换了所有内容,包括非捕获组。我如何编写一个只替换捕获组的正则表达式?

"5,214".gsub(/(?:\d)(,)(?:\d)/, '.')
# => ".14"

我想要的结果:

"5,214".gsub(some_regex)
#=> "5.214
qyyhg6bp

qyyhg6bp1#

非捕获组仍使用匹配
使用了
"5,214".gsub(/(\d+)(,)(\d+)/, '\1.\3')

"5,214".gsub(/(?<=\d+)(,)(?=\d+)/, '.')

xmjla07d

xmjla07d2#

不能。gsub将替换整个匹配;它不对捕获的组执行任何操作。2捕获与否对组没有任何影响。
为了获得结果,需要使用lookbehind和lookahead。

"5,214".gsub(/(?<=\d),(?=\d)/, '.')
dfty9e19

dfty9e193#

也可以在块版本中使用Regexp.last_match(也可通过$~获得)来访问完整的MatchData

"5,214".gsub(/(\d),(\d)/) { |_|
    match = Regexp.last_match

    "#{match[1]}.#{match[2]}"
}

这可以更好地扩展到更复杂的用例。
贝内,来自Ruby文档:
::last_match对于执行模式匹配的方法的线程和方法范围是本地的。

nhjlsmyf

nhjlsmyf4#

gsub替换正则表达式引擎生成的整个匹配。捕获/非捕获组结构都不保留。但是,您可以使用不“消耗”字符串中任何字符的lookaroundAssert。

"5,214".gsub(/\d\K,(?=\d)/, '.')

说明:\K逸出序列会重设报告相符项目的起始点 *,而且不再包含任何先前使用的字符 *。也就是说,我们接着会寻找并比对逗号,而正向Lookahead会判断提示后面跟着数字。

0g0grzrc

0g0grzrc5#

我对露比一无所知。
但是从我在教程中看到的情况来看
gsub表示替换,模式应该是/(?<=\d+),(?=\d+)/,只是用点替换逗号或,使用捕获/(\d+),(\d+)/将字符串替换为"\1.\2"

c9qzyr3d

c9qzyr3d6#

您不需要regexp来实现您所需要的:
'1,200.00'.tr('.','!').tr(',','.').tr('!', ',')

  • 句号变成刘海(1,200!00
  • 逗号变成句号(1.200!00
  • 刘海变成逗号(1.200,00
nlejzf6q

nlejzf6q7#

您可以轻松地在替换字符串(第二个参数)中引用捕获组,如下所示:

"5,214".gsub(/(\d+)(,)(\d+)/, '\1.\3')
#=> "5.214"
  • \0将返回整个匹配字符串。
  • \1将被第一捕获组替换。
  • \2将被第二捕获组替换,等等。

您可以使用,字符的非捕获组重写上面的示例。

"5,214".gsub(/(\d+)(?:,)(\d+)/, '\1.\2')
#=> "5.214"

正如您所看到的,逗号后面的部分现在是第二个捕获组,因为我们将中间的组定义为非捕获组。
尽管在这种情况下这是没有意义的。

"5,214".gsub(/(\d+),(\d+)/, '\1.\2')
#=> "5.214"

相关问题