【问题标题】:Ruby regex - gsub only captured groupRuby 正则表达式 - gsub 仅捕获组
【发布时间】:2014-10-20 01:25:28
【问题描述】:

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

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

我想要的结果:

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

【问题讨论】:

  • 如果是这种情况,为什么不直接替换逗号?
  • 我可能有一个较长的字符串,其中逗号用于不同的上下文。例如:I went to the store, and then I bought something for $1,200. 我只想替换匹配以下内容的逗号:\d,\d
  • 如果字符串中还有小数点,那会混淆。如果您想将语言环境更改为使用 . 数千的语言,那么您是在问一个 XY 问题。与从头开始尝试相比,使用语言环境库可能会为您提供更强大的解决方案。

标签: ruby regex


【解决方案1】:

你不能。 gsub 替换整个匹配;它不会对捕获的组做任何事情。组是否被捕获没有任何区别。

为了达到结果,你需要使用lookbehind和lookahead。

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

【讨论】:

  • 我个人找到alpha bravo's answer。 IMO 对于非平凡的正则表达式实现起来要容易得多。 "5,214".gsub(/(\d+)(,)(\d+)/, '\1.\3')。它的作用是:定义三个组:(之前)(您需要替换的内容)(之后)和现在替换为(之前)(您的替换)(之后)。
【解决方案2】:

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

"5,214".gsub(/(?&lt;=\d+)(,)(?=\d+)/, '.')

【讨论】:

  • "5,214".gsub(/(\d+),(\d+)/, '\1.\2') 也有效。并保存一个不需要的捕获组。
  • 正如你的名字,你的解决方案很棒!
【解决方案3】:

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

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

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

这可以更好地扩展到更多涉及的用例。

注意事项,来自 Ruby 文档:

::last_match 对于进行模式匹配的方法的线程和方法范围是本地的。

【讨论】:

  • 感谢 Raphael,解决了我的问题。有趣的是,匹配索引从 1 而不是 0 开始。
  • @PaulWatson Entry 0 是完全匹配,如果你愿意的话,是一个围绕完整正则表达式的隐式组。
【解决方案4】:

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

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

解释:\K 转义序列重置了报告匹配的起点并且不再包含任何以前使用的字符。话虽如此,然后我们查找并匹配逗号,Positive Lookahead 断言后面有一个数字。

【讨论】:

【解决方案5】:

我对红宝石一无所知。

但是从我在tutorial看到的情况来看

gsub 表示替换, 模式应该是/(?&lt;=\d+),(?=\d+)/ 只需用点替换逗号 或者,使用捕获/(\d+),(\d+)/ 将字符串替换为"\1.\2"

【讨论】:

    【解决方案6】:

    你不需要正则表达式来实现你所需要的:

    '1,200.00'.tr('.','!').tr(',','.').tr('!', ',')

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 2022-07-16
      • 1970-01-01
      • 2018-03-11
      相关资源
      最近更新 更多