Mam problem z przetłumaczeniem tego na język Ruby.
Oto fragment JavaScript, który robi dokładnie to, co chcę:
function get_code(str){
return str.replace(/^(Z_.*): .*/,"$1");
}
Próbowałem gsub , sub i replace, ale żaden nie wydaje się robić tego, czego oczekuję.
Oto przykłady rzeczy, których próbowałem:
"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 }
Odpowiedzi:
Spróbuj
'\1'
zamiany ( pojedyncze cudzysłowy są ważne, w przeciwnym razie musisz uciec\
):Ale ponieważ wydaje się, że interesuje Cię tylko grupa przechwytywania, zwróć uwagę, że możesz zindeksować ciąg za pomocą wyrażenia regularnego:
źródło
-e
), jest bardziej prawdopodobne, że zobaczysz podwójne cudzysłowy :printf "Punkinhead the name" | ruby -ne 'puts gsub /.*(the name)/, "Jonathans \\1"'
ponieważ wyrażenie dostarczane do-e
jest zwykle zawijane w pojedyncze cudzysłowy.\1
w cudzysłowie muszą zostać zmienione. Więc ty też chceszlub
zobacz dokumentację na gsub, gdzie jest napisane: "Jeśli jest to ciąg znaków w podwójnych cudzysłowach, oba odniesienia wsteczne muszą być poprzedzone dodatkowym ukośnikiem odwrotnym."
Biorąc to pod uwagę, jeśli chcesz tylko wyniku meczu, możesz zrobić:
lub
Zwróć uwagę, że nie
(?=:)
jest to grupa do przechwytywania, więc:
nie pojawia się ona w Twoim meczu.źródło
źródło
Jeśli potrzebujesz użyć wyrażenia regularnego do odfiltrowania niektórych wyników, a WTEDY użyj tylko grupy przechwytywania, możesz wykonać następujące czynności:
źródło
źródło
$
zmienne są ustawiane tylko tak, aby pasowały do bloku:Jest to również jedyny sposób na wywołanie metody w dopasowaniu. Nie zmieni to dopasowania, tylko
strip
„\ 1” (pozostawiając bez zmian):źródło