Ruby用捕获的正则expression式模式replacestring
我无法将其翻译成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 }
尝试'\1'
的replace( 单引号是重要的,否则你需要转义\
):
"foo".gsub(/(o+)/, '\1\1\1') #=> "foooooo"
但是由于您似乎只对捕获组感兴趣,请注意您可以使用正则expression式对string进行索引:
"foo"[/oo/] #=> "oo" "Z_123: foobar"[/^Z_.*(?=:)/] #=> "Z_123"
\1
双引号需要逃脱。 所以你要么
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\\1")
要么
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, '\1')
请参阅gsub上的文档,其中指出:“如果是双引号string,则两个后引用必须前面加上一个反斜杠。”
这就是说,如果你只是想要比赛的结果,你可以这样做:
"Z_sdsd: sdsd".scan(/^Z_.*(?=:)/)
要么
"Z_sdsd: sdsd"[/^Z_.*(?=:)/]
请注意, (?=:)
是一个非捕获组,所以:
在您的匹配中不显示。
"foobar".gsub(/(o+)/){|s|s+'ball'} #=> "fooballbar"
def get_code(str) str.sub(/^(Z_.*): .*/, '\1') end get_code('Z_foo: bar!') # => "Z_foo"
如果您需要使用正则expression式来过滤一些结果,那么只使用捕获组,您可以执行以下操作:
str = "Leesburg, Virginia 20176" state_regex = Regexp.new(/,\s*([A-Za-z]{2,})\s*\d{5,}/) # 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"