Ruby 用捕获的正则表达式模式替换字符串
Posted
技术标签:
【中文标题】Ruby 用捕获的正则表达式模式替换字符串【英文标题】:Ruby replace string with captured regex pattern 【发布时间】:2012-04-11 12:15:59 【问题描述】:我无法将其翻译成 Ruby。
这是一段完全符合我要求的 javascript:
function get_code(str)
return str.replace(/^(Z_.*): .*/,"$1");
我尝试过gsub、sub 和replace,但似乎没有一个能达到我的预期。
以下是我尝试过的示例:
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/) |capture| capture
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "$1")
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "#$1")
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\1")
"Z_sdsd: sdsd".gsub(/(.).*/) |capture| capture
【问题讨论】:
您应该显示您尝试过的实际代码。 @Amber 我放了我试过的样本。 【参考方案1】:尝试'\1'
替换(单引号很重要,否则您需要转义\
):
"foo".gsub(/(o+)/, '\1\1\1')
#=> "foooooo"
但由于您似乎只对捕获组感兴趣,请注意您可以使用正则表达式对字符串进行索引:
"foo"[/oo/]
#=> "oo"
"Z_123: foobar"[/^Z_.*(?=:)/]
#=> "Z_123"
【讨论】:
请注意,这仅适用于替换字符串在 单引号内的情况。我浪费了 5 分钟才弄清楚。 @MarkThomas - 通常我们会在没有阅读全部答案的情况下先尝试最热门/接受的答案。这似乎通常是解决问题的最有效方法。让维姬休息一下! :) @VickyChijwani 不错的评论,但还要注意,当使用 Ruby 内联时(在带有-e
的命令行上),更有可能看到双引号:@987654326 @ 因为提供给-e
的表达式通常用单引号括起来。
@JagdeepSingh,默认情况下,它会替换所有出现的地方。
@VickyChijwani 当你想使用双引号时,你可以写"\\1"
而不是'\1'
。然后像"Z_123_2018".gsub(/\A(Z_\d+_)(\d4)\z/, "\\1#$2.to_i+1") → "Z_123_2019"
这样的东西是可能的。【参考方案2】:
双引号中的\1
需要转义。所以你想要
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\\1")
或
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, '\1')
请参阅the docs on gsub,它说“如果它是双引号字符串,则两个反向引用必须在前面加上一个额外的反斜杠。”
话虽如此,如果你只想要比赛的结果,你可以这样做:
"Z_sdsd: sdsd".scan(/^Z_.*(?=:)/)
或
"Z_sdsd: sdsd"[/^Z_.*(?=:)/]
请注意,(?=:)
是非捕获组,因此 :
不会出现在您的匹配中。
【讨论】:
【参考方案3】: "foobar".gsub(/(o+)/)|s|s+'ball'
#=> "fooballbar"
【讨论】:
不知道我能做到。不错! 那个块很方便!【参考方案4】:如果您需要使用正则表达式过滤某些结果,然后只使用捕获组,您可以执行以下操作:
str = "Leesburg, Virginia 20176"
state_regex = Regexp.new(/,\s*([A-Za-z]2,)\s*\d5,/)
# looks for the comma, possible whitespace, captures alpha,
# looks for possible whitespace, looks for zip
> str[state_regex]
=> ", Virginia 20176"
> str[state_regex, 1] # use the capture group
=> "Virginia"
【讨论】:
【参考方案5】:def get_code(str)
str.sub(/^(Z_.*): .*/, '\1')
end
get_code('Z_foo: bar!') # => "Z_foo"
【讨论】:
【参考方案6】:$
变量只设置为匹配到块中:
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/) "# $1.strip "
这也是在比赛中调用方法的唯一方式。这不会改变匹配,只有strip
"\1" (保持不变):
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\\1".strip)
【讨论】:
以上是关于Ruby 用捕获的正则表达式模式替换字符串的主要内容,如果未能解决你的问题,请参考以下文章