Ruby gsub 匹配串联

标签 ruby regex substitution

给定一串数字,我试图在奇数之间插入 '-',在偶数之间插入 '*'。解决方案如下:

def DashInsertII(num)
  num = num.chars.map(&:to_i)
  groups = num.slice_when {|x,y| x.odd? && y.even? || x.even? && y.odd?}.to_a
  puts groups.to_s
    groups.map! do |array|
      if array[0].odd?
      array.join(" ").gsub(" ", "-")
      else
      array.join(" ").gsub(" ", "*")
    end
  end
  d = %w{- *}
  puts groups.join.chars.to_s
  groups = groups.join.chars

 # Have to account for 0 because Coderbyte thinks 0 is neither even nor odd, which is false.

  groups.each_with_index do |char,index|
    if d.include? char
        if (groups[index-1] == "0" || groups[index+1] == "0")
            groups.delete_at(index)
        end
    end
  end
  groups.join
end

非常复杂,我想知道我是否可以做这样的事情:

"99946".gsub(/[13579][13579]/) {|s,x| s+"-"+x}

s 是第一个奇数,x 是第二个。通常当我替换时,我替换匹配的术语,但这里我想保留匹配的术语并在模式之间插入一个字符。这将使这个问题变得简单得多。

最佳答案

这对你有用:

"99946".gsub(/[13579]+/) {|s| s.split("").join("-") }
# => "9-9-946"

这与您尝试的大致相似。它捕获多个连续的奇数位,并使用 gsub block 将它们拆分,然后将它们以“-”分隔。

这将包括协同工作的两种解决方案:

"99946".gsub(/[13579]+/) {|s| s.split("").join("-") }.gsub(/[02468]+/) {|s| s.split("").join("*") }
# => "9-9-94*6"

关于Ruby gsub 匹配串联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37356879/

相关文章:

prolog - 找出给定格式中所有可能的单词组合

ruby-on-rails - 一次循环两个数组

ruby - Rails 加载错误版本的 Ruby

ruby - 功能中的 Cucumber HTML 标记

java - 正则表达式 - 从 Java 中的字符串中提取信息

c# - 如何转义 .NET Regex Replace 中的替换/替换部分

ruby-on-rails - Rails 5 - config.assets.compile 应该是真的 - 为什么?

javascript - 匹配并不总是在一起的特定 URL 参数

python - 有没有一种方法可以从两边都有不同数量的零包围的字符串中提取数字?

Vim 在文本放置时或之后立即更改文本