Ich habe Probleme, dies in Ruby zu übersetzen.
Hier ist ein Stück JavaScript, das genau das tut, was ich tun möchte:
function get_code(str){
return str.replace(/^(Z_.*): .*/,"$1");
}
Ich habe gsub , sub und replace ausprobiert , aber keiner scheint das zu tun, was ich erwarte.
Hier sind Beispiele für Dinge, die ich versucht habe:
"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 }
Antworten:
Versuchen Sie es
'\1'
mit dem Ersatz ( einfache Anführungszeichen sind wichtig, sonst müssen Sie dem entkommen\
):Beachten Sie jedoch, dass Sie eine Zeichenfolge mit einem regulären Ausdruck indizieren können, da Sie anscheinend nur an der Erfassungsgruppe interessiert sind:
quelle
-e
) eher doppelte Anführungszeichen angezeigt werden :printf "Punkinhead the name" | ruby -ne 'puts gsub /.*(the name)/, "Jonathans \\1"'
weil Ausdruck für bereitgestellt wird-e
wird normalerweise in einfache Anführungszeichen gesetzt.\1
in doppelten Anführungszeichen muss maskiert werden. Also willst du auch nichtoder
siehe die Dokumentation auf gsub , wo es heißt : „Wenn es ein Strings in doppelten Anführungszeichen ist, müssen beide wieder Verweise durch einen zusätzlichen Backslash vorangestellt werden.“
Davon abgesehen, wenn Sie nur das Ergebnis des Spiels wollen, können Sie Folgendes tun:
oder
Beachten Sie, dass es sich bei der
(?=:)
Gruppe um eine nicht erfassende Gruppe handelt, sodass die Gruppe:
in Ihrem Spiel nicht angezeigt wird.quelle
quelle
Wenn Sie einen Regex verwenden müssen, um einige Ergebnisse zu filtern, und DANN nur die Erfassungsgruppe verwenden, können Sie Folgendes tun:
quelle
quelle
$
Variablen werden nur so eingestellt, dass sie mit dem Block übereinstimmen:Dies ist auch die einzige Möglichkeit, eine Methode für das Match aufzurufen. Dies ändert nichts an der Übereinstimmung, nur
strip
"\ 1" ( bleibt unverändert):quelle