2013-05-06 3 views
4
내가 문자열을 변환 할

:참조하는 방법 루비 정규 표현식

"{john:123456}" 

로는 :

"<script src='https://gist.github.com/john/123456.js'>" 

나는 작동하는 방법을 썼다, 그러나 그것은 아주 어리 석다. 그것은 다음과 같이이다 :

def convert 
    args = [] 

    self.scan(/{([a-zA-Z0-9\-_]+):(\d+)}/) {|x| args << x} 

    args.each do |pair| 
     name = pair[0] 
     id = pair[1] 
     self.gsub!("{" + name + ":" + id + "}", "<script src='https://gist.github.com/#{name}/#{id}.js'></script>") 
    end 

    self 
end 

는 아래 사항을 cool_method처럼이 할 수있는 방법이 있나요?

"{john:123}".cool_method(/{([a-zA-Z0-9\-_]+):(\d+)}/, "<script src='https://gist.github.com/$1/$2.js'></script>") 
+2

어딘가에서 JSON으로 들어오는 경우 JSON 만 사용합니다. 그리고 정규식 솔루션은 "좋은"반면, 나는 여전히 분할 및 절단/결과 값의 색인 생성을 고려할 것입니다. –

+1

+1 @DaveNewton. 들어오는 데이터 문자열은 JSON이므로 첫 번째 단계는 객체 형식으로 다시 설정 한 다음 마사지하는 것입니다. JSON을 Regex로 구문 분석하면 잘못 처리 될 수 있습니다. 해시 또는 배열에서 값을 마사지하는 것은 큰 호황을 누릴 가능성이 적습니다. –

+0

항상 하나의 이름/값만 있거나 여러 항목을받을 수 있습니까? 그리고 문자열''{john : 123456} ''입니까 아니면 정말''{{ "john": 123456} "입니까? –

답변

7

멋진 방법은 gsub입니다. 너 너무 가까웠다! 그냥 변경 $ 1, $ 2 \\ 1 및 \\ 2

@DaveNewton 말했듯이, 하나로 취급, JSON 문자열처럼 보이는, 그래서

http://ruby-doc.org/core-2.0/String.html#method-i-gsub

"{john:123}".gsub(/{([a-zA-Z0-9\-_]+):(\d+)}/, 
    "<script src='https://gist.github.com/\\1/\\2.js'></script>") 
+2

class String; 별칭 : cool_method : gsub; 끝, :) –

+0

@Shawn : 당신의 종류에 고마워, 내가 루비 - 기본, 당신에게 최고의 안부를 배워야한다고 생각해. – boostbob

1

나는

def convert 
    /{(?<name>[a-zA-Z0-9\-_]+):(?<id>\d+)}/ =~ self 
    "<script src='https://gist.github.com/#{name}/#{id}.js'></script>" 
end 

은 자세한 내용은 http://ruby-doc.org/core-2.0/Regexp.html#label-Capturing를 참조하십시오 할 것입니다.

+1

특수 메서드에 대한 String 클래스를 여는 이유는 무엇입니까? – Shoe

+0

나는 둘 중 하나이지만 문자열 보간법을 사용하는 것은 정말로 여기에있는 길이다. –

+0

@ Jueecy.new OP의'convert'는 String 클래스의 멤버 함수처럼 보입니다. 어쨌든 숀의 대답이 더 좋을 것 같아. –

1
s = "{john:123456}".scan(/\w+|\d+/).each_with_object("<script src='https://gist.github.com") do |i,ob| 
    ob<< "/" + i 
end.concat(".js'>") 
p s #=> "<script src='https://gist.github.com/john/123456.js'>" 
+0

코드에 감사드립니다. scan과 each_with_object 메소드가 함께 작동 할 수 있다는 것을 알고 있습니다. 당신을 최고로 생각합니다. – boostbob

1

:

require 'json' 
json = '{"john":123456}' 
name, value = JSON[json].flatten 
"<script src='https://gist.github.com/#{ name }/#{ value }.js'></script>" 
=> "<script src='https://gist.github.com/john/123456.js'></script>" 

왜 문자열로 처리하고 정규식을 사용합니까? JSON은 정규 표현식을 통한 구문 분석을위한 간단한 형식이 아니기 때문에 값이 변경되거나 데이터 문자열이 복잡해지면서 오류가 발생할 수 있습니다.