programing

Ruby Regexp 그룹 일치, 한 줄에 변수 할당

css3 2023. 7. 9. 12:34

Ruby Regexp 그룹 일치, 한 줄에 변수 할당

현재 문자열을 여러 변수로 exp하는 중입니다.예 문자열:

ryan_string = "RyanOnRails: This is a test"

저는 이 regexp와 3개의 그룹으로 일치시켰습니다.

ryan_group = ryan_string.scan(/(^.*)(:)(.*)/i)

이제 각 그룹에 액세스하려면 다음과 같은 작업을 수행해야 합니다.

ryan_group[0][0] (first group) RyanOnRails
ryan_group[0][1] (second group) :
ryan_group[0][2] (third group) This is a test

이것은 꽤 우스꽝스럽고 제가 뭔가 잘못하고 있는 것처럼 느껴집니다.저는 다음과 같은 일을 할 수 있을 것으로 기대합니다.

g1, g2, g3 = ryan_string.scan(/(^.*)(:)(.*)/i)

이것이 가능합니까?아니면 제가 하는 것보다 더 좋은 방법이 있을까요?

당신은 원하지 않습니다.scan이것은 거의 말이 안 되기 때문에.사용할 수 있습니다.String#match그러면 a가 반환됩니다.MatchData객체, 그러면 호출할 수 있습니다.#captures캡처 배열을 반환합니다.이와 같은 것:

#!/usr/bin/env ruby

string = "RyanOnRails: This is a test"
one, two, three = string.match(/(^.*)(:)(.*)/i).captures

p one   #=> "RyanOnRails"
p two   #=> ":"
p three #=> " This is a test"

일치하는 항목이 발견되지 않을 경우,String#match0을 반환하므로 다음과 같은 작업이 더 잘 수행될 수 있습니다.

if match = string.match(/(^.*)(:)(.*)/i)
  one, two, three = match.captures
end

비록 ~일지라도scan이것에 대해 거의 말이 되지 않습니다.여전히 작동합니다. 먼저 반환된 배열을 평평하게 만들기만 하면 됩니다. one, two, three = string.scan(/(^.*)(:)(.*)/i).flatten

일치 또는 =~를 사용하여 단일 일치를 제공하고 동일한 방식으로 일치 데이터에 액세스하거나 특수 일치 변수 $1, $2, $3를 사용할 수 있습니다.

다음과 같은 것:

if ryan_string =~ /(^.*)(:)(.*)/i
   first = $1
   third = $3
end

캡처한 일치 항목의 이름을 지정할 수 있습니다.

string = "RyanOnRails: This is a test"
/(?<one>^.*)(?<two>:)(?<three>.*)/i =~ string
puts one, two, three

문자열과 정규식 순서를 거꾸로 하면 작동하지 않습니다.

당신은 그것이 좋은 생각인지 결정해야 하지만, 루비 regexp는 당신을 위해 (자동으로) 로컬 변수를 정의할 수 있습니다!

이 기능이 멋진지 완전히 미친지는 아직 확신할 수 없지만 정규식은 로컬 변수를 정의할 수 있습니다.

ryan_string = "RyanOnRails: This is a test"
/^(?<webframework>.*)(?<colon>:)(?<rest>)/ =~ ryan_string
# This defined three variables for you. Crazy, but true.
webframework # => "RyanOnRails"
puts "W: #{webframework} , C: #{colon}, R: #{rest}"

(http://ruby-doc.org/core-2.1.1/Regexp.html 에서 "로컬 변수"를 검색합니다.)

참고: 댓글에서 지적한 바와 같이, 이 질문에 대한 @toonsend(https://stackoverflow.com/a/21412455) 의 유사하고 이전 답변이 있음을 알 수 있습니다.저는 제가 "도둑질"을 하고 있었다고 생각하지 않지만, 칭찬과 첫 번째 대답을 존중하고 싶다면 자유롭게 하세요 :) 동물들이 다치지 않았으면 좋겠습니다.

scan()문자열에서 regex의 중복되지 않는 일치 항목을 모두 찾을 수 있으므로 예상하는 것처럼 그룹 배열을 반환하는 대신 배열 배열을 반환합니다.

아마도 사용하는 것이 더 나을 것입니다.match()그리고 나서 다음을 사용하여 캡처 배열을 가져옵니다.MatchData#captures:

g1, g2, g3 = ryan_string.match(/(^.*)(:)(.*)/i).captures

하지만 당신은 또한 이것을 할 수 있습니다.scan()원하는 경우:

g1, g2, g3 = ryan_string.scan(/(^.*)(:)(.*)/i)[0]

언급URL : https://stackoverflow.com/questions/9303984/ruby-regexp-group-matching-assign-variables-on-1-line