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#match
0을 반환하므로 다음과 같은 작업이 더 잘 수행될 수 있습니다.
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
'programing' 카테고리의 다른 글
소규모 개발 팀을 위한 Git 브랜치 전략 (0) | 2023.07.09 |
---|---|
탁월한 전자 메일 검증 공식 (0) | 2023.07.09 |
Firestore: 부등식/비등식 쿼리를 수행하는 방법 (0) | 2023.07.09 |
해당 속성의 이름에 해당하는 문자열이 지정된 개체 속성에 액세스(가져오기 또는 설정)하는 방법 (0) | 2023.07.09 |
SQL Server에 연결하는 동안 네트워크 관련 오류 또는 인스턴스 관련 오류가 발생한 이유는 무엇입니까? (0) | 2023.07.09 |