source

루비 문자열을 캡처된 정규식 패턴으로 바꿉니다.

factcode 2023. 6. 23. 22:28
반응형

루비 문자열을 캡처된 정규식 패턴으로 바꿉니다.

저는 이것을 루비로 번역하는 데 어려움을 겪고 있습니다.

다음은 제가 원하는 작업을 정확히 수행하는 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"

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

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

이것은 또한 경기에서 메소드를 호출하는 유일한 방법입니다.일치 항목만 변경되지 않습니다.strip"\1"(변경되지 않은 것으로 간주):

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

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

반응형