Руби заменить строку с захваченным регулярным выражением - PullRequest
109 голосов
/ 28 марта 2012

У меня проблемы с переводом этого на Ruby.

Вот фрагмент JavaScript, который делает именно то, что я хочу сделать:

function get_code(str){
    return str.replace(/^(Z_.*): .*/,"$1")​​​​​​​​​​​​​​​​​​​​​​​​​​​;
}

Я пробовал gsub , sub и заменяют , но, похоже, никто не делает то, что я ожидаю.

Вот примеры того, что я пробовал:

"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 }

Ответы [ 5 ]

175 голосов
/ 28 марта 2012

Попробуйте '\1' для замены ( одинарные кавычки важны, в противном случае вам нужно экранировать \):

"foo".gsub(/(o+)/, '\1\1\1')
#=> "foooooo"

Но так как вас интересует только группа захвата, обратите внимание, что вы можете индексировать строку с помощью регулярного выражения:

"foo"[/oo/]
#=> "oo"
"Z_123: foobar"[/^Z_.*(?=:)/]
#=> "Z_123"
35 голосов
/ 28 марта 2012

\1 в двойных кавычках необходимо экранировать. Итак, вы хотите либо

"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\\1")

или

"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, '\1')

см. документы на gsub , где написано "Если это строка в двойных кавычках, обеим обратным ссылкам должна предшествовать дополнительная обратная косая черта."

При этом, если вы просто хотите получить результат матча, вы можете сделать:

"Z_sdsd: sdsd".scan(/^Z_.*(?=:)/)

или

"Z_sdsd: sdsd"[/^Z_.*(?=:)/]

Обратите внимание, что (?=:) - это группа без захвата, поэтому : не отображается в вашем матче.

11 голосов
/ 08 февраля 2014
 "foobar".gsub(/(o+)/){|s|s+'ball'}
 #=> "fooballbar"
4 голосов
/ 20 октября 2014

Если вам нужно использовать регулярное выражение для фильтрации некоторых результатов, а ТОГДА использовать только группу захвата, вы можете сделать следующее:

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"
1 голос
/ 28 марта 2012
def get_code(str)
  str.sub(/^(Z_.*): .*/, '\1')
end
get_code('Z_foo: bar!') # => "Z_foo"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...