【问题标题】:Regex - capture multiple groups and combine them multiple times in one string正则表达式 - 捕获多个组并将它们多次组合在一个字符串中
【发布时间】:2019-12-27 13:22:22
【问题描述】:

我需要使用正则表达式组合一些文本,但是在尝试捕获和替换我的字符串时遇到了一些麻烦。例如 - 我需要从一开始就捕获数字,并将它们添加到 || 之间关闭的每个部分的替换中

我有:

||10||a||ab||abc||

我想要:

||10||a10||ab10||abc10||

所以我需要捕获组 1 中的“10”和捕获组 2 中的“a|ab|abc”

我尝试过类似的方法,但它对我不起作用(仅捕获一个 [a-z] 组)

(?=.*\|\|(\d+)\|\|)(?=.*\b([a-z]+\b))

【问题讨论】:

  • 如果没有无限宽度的lookbehind 或一些额外的代码,您将无法正确执行此操作。它在 C# 中使用吗?
  • 每行管道之间是否总是正好有 4 个值?
  • @TimBiegeleisen - 不,可以有更多或更少的值
  • 您使用什么语言/工具?
  • 我不知道/不使用 Ruby,但我建议只提取第一个值,然后在 || 上拆分您的字符串,最后将其拼凑在一起。

标签: regex ruby


【解决方案1】:

我可以在没有复杂的正则表达式的情况下实现这一点。例如,您可以这样做:

input = "||10||a||ab||abc||"
parts = input.scan(/\w+/)   # => ["10", "a", "ab", "abc"]
parts[1..-1].each { |part| part << parts[0] }   # => ["a10", "ab10", "abc10"]

"||#{parts.join('||')}||"

【讨论】:

    【解决方案2】:
    str = "||10||a||ab||abc||"
    

    first = nil
    str.gsub(/(?<=\|\|)[^\|]+/) { |s| first.nil? ? (first = s) : s + first }
      #=> "||10||a10||ab10||abc10||" 
    

    正则表达式读作“匹配紧跟在两个管道后面的管道中的一个或多个字符”((?&lt;=\|\|) 是一个正向回溯)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      • 1970-01-01
      • 2010-12-19
      相关资源
      最近更新 更多