Ruby는 캡처 된 정규식 패턴으로 문자열을 대체합니다.


121

이것을 Ruby로 번역하는 데 문제가 있습니다.

다음은 내가 원하는 작업을 정확히 수행하는 JavaScript의 일부입니다.

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

나는 gsub , subreplace를 시도했지만 내가 기대하는 바를 수행하는 것 같지 않습니다.

내가 시도한 것의 예는 다음과 같습니다.

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

시도한 내용에 대한 실제 코드를 표시해야합니다.
Amber

@Amber 내가 시도한 샘플을 넣었습니다.
JD Isaacks

답변:


192

'\1'교체를 시도하십시오 ( 작은 따옴표 가 중요합니다. 그렇지 않으면를 이스케이프해야합니다 \).

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

하지만 캡처 그룹에만 관심이있는 것 같기 때문에 정규식으로 문자열을 인덱싱 할 수 있습니다.

"foo"[/oo/]
#=> "oo"
"Z_123: foobar"[/^Z_.*(?=:)/]
#=> "Z_123"

68
이것은 대체 문자열이 작은 따옴표 안에있는 경우에만 작동 합니다 . 나는 그것을 알아내는 데 5 분을 낭비했다.
Vicky Chijwani 2013

7
@MarkThomas-종종 우리는 전체 답변을 읽지 않고 상위 / 허용 된 답변을 먼저 시도합니다. 일반적으로 문제를 해결하는 가장 효율적인 방법 인 것 같습니다. Vicky에게 휴식을주세요! :)
Josh M.

@VickyChijwani 좋은 주석뿐만 아니라 (명령 행에 루비 인라인을 사용할 때주의 -e), 그것은 가능성이 보는 것입니다 따옴표 : printf "Punkinhead the name" | ruby -ne 'puts gsub /.*(the name)/, "Jonathans \\1"'제공 표현식이 있기 때문에 -e일반적으로 작은 따옴표로 싸여있다.
조나단 Komar

문자열의 모든 패턴 발생에 대해이 작업을 수행하는 방법은 무엇입니까?
JAGDEEP 싱

1
@JagdeepSingh, 그것은 기본적으로 모든 발생을 대체합니다.
Iulian Onofrei 2017

36

\1큰 따옴표 안에는 이스케이프해야합니다. 그래서 당신은

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

또는

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

"큰 따옴표로 묶인 문자열 인 경우 두 역 참조 앞에 추가 백 슬래시가 있어야합니다."라고 표시된 gsub의 문서를 참조하십시오 .

즉, 경기 결과를 원하면 다음을 수행 할 수 있습니다.

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

또는

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

은 ( (?=:)는) 캡처 :되지 않는 그룹이므로 일치에 표시되지 않습니다.



5

정규식을 사용하여 일부 결과를 필터링해야하고 캡처 그룹 만 사용하는 경우 다음을 수행 할 수 있습니다.

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"

2
def get_code(str)
  str.sub(/^(Z_.*): .*/, '\1')
end
get_code('Z_foo: bar!') # => "Z_foo"

0

$ 변수는 블록과 일치하도록 설정됩니다.

"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/) { "#{ $1.strip }" }

이것은 또한 매치에서 메서드를 호출하는 유일한 방법입니다. 이것은 일치를 변경하지 않고 strip"\ 1" 만 변경합니다 (변경하지 않음).

"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\\1".strip)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.