У меня проблемы с переводом этого на 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'
заменить ( одинарные кавычки важны, иначе вам нужно избежать\
):Но поскольку вам кажется, что вас интересует только группа захвата, обратите внимание, что вы можете индексировать строку с помощью регулярного выражения:
источник
-e
) более вероятно увидеть двойные кавычки :printf "Punkinhead the name" | ruby -ne 'puts gsub /.*(the name)/, "Jonathans \\1"'
потому что выражение, предоставленное для-e
, обычно заключено в одинарные кавычки.\1
в двойных кавычках нужно экранировать. Так ты хочешьили
см. документацию на gsub, где говорится: «Если это строка в двойных кавычках, обеим обратным ссылкам должна предшествовать дополнительная обратная косая черта».
При этом, если вам просто нужен результат матча, вы можете:
или
Обратите внимание, что
(?=:)
это не захватывающая группа, поэтому:
не отображается в вашем матче.источник
источник
Если вам нужно использовать регулярное выражение для фильтрации некоторых результатов, а ЗАТЕМ использовать только группу захвата, вы можете сделать следующее:
источник
источник
$
переменные устанавливаются только на совпадения в блоке:Это также единственный способ вызвать метод для соответствия. Это не изменит совпадение, только
strip
"\ 1" (оставив его без изменений):источник