Programming

루비는 문자열을 캡처 된 정규식 패턴으로 대체

procodes 2020. 7. 28. 22:20
반응형

루비는 문자열을 캡처 된 정규식 패턴으로 대체


이것을 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'대체를 시도하십시오 ( 작은 따옴표 가 중요합니다. 그렇지 않으면을 탈출해야합니다 \).

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

그러나 캡처 그룹에만 관심이있는 것처럼 보이기 때문에 정규 표현식으로 문자열을 색인 할 수 있습니다.

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

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

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

또는

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

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

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

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

또는

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

참고는 그 (?=:)비 캡처 그룹 인은 그래서 :당신의 경기에 표시되지 않습니다.


 "foobar".gsub(/(o+)/){|s|s+'ball'}
 #=> "fooballbar"

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

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"

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

참고 URL : https://stackoverflow.com/questions/9898461/ruby-replace-string-with-captured-regex-pattern

반응형