Estou tendo problemas para traduzir isso em Ruby.
Aqui está um pedaço de JavaScript que faz exatamente o que eu quero fazer:
function get_code(str){
return str.replace(/^(Z_.*): .*/,"$1");
}
Eu tentei gsub , sub e replace, mas nenhum parece fazer o que estou esperando.
Aqui estão exemplos de coisas que tentei:
"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 }
Respostas:
Tente
'\1'
a substituição ( aspas simples são importantes, caso contrário você precisará escapar da\
):Mas como você parece estar interessado apenas no grupo de captura, observe que é possível indexar uma sequência com uma expressão regular:
fonte
-e
), é mais provável que haja aspas duplas :printf "Punkinhead the name" | ruby -ne 'puts gsub /.*(the name)/, "Jonathans \\1"'
porque a expressão fornecida-e
geralmente está entre aspas simples.\1
aspas duplas precisa ser escapado. Então você querou
veja os documentos no gsub em que diz "Se for uma string com aspas duplas, as duas referências anteriores deverão ser precedidas por uma barra invertida adicional".
Dito isto, se você quiser apenas o resultado da partida, poderá:
ou
Observe que o grupo
(?=:)
é não capturante, para que:
não apareça na sua partida.fonte
fonte
Se você precisar usar uma regex para filtrar alguns resultados, e ENTÃO usar apenas o grupo de captura, poderá fazer o seguinte:
fonte
fonte
$
As variáveis são definidas apenas para correspondências no bloco:Essa também é a única maneira de chamar um método na partida. Isso não mudará a correspondência, apenas
strip
"\ 1" (sem alteração):fonte