2016-09-06 3 views
1

문자열에 "코드화 된"메시지가 주어지고 디코드 된 메시지를 반환해야하는 문제에 대해 작업하고 있습니다. 이것은 배열로 혼합 된 문자와 숫자의 문자열을 나눠야합니다. 그래서 예를 들면, 나는이 같은 문자열 가지고있는 경우 :Ruby - 혼합 문자열을 배열로 변환하기

"0h" 

을이 같은 배열로 분할 할 :

[0, "h"] 

하지만 .split를 사용할 때 나는

["0", "h"] 
를 얻을 수

내가 찾은 해결책은 모든 숫자이지만 혼합 문자열이 아닌 문자열 만 고려합니다. 문자를 유지하면서 숫자를 숫자로 변환하는 방법이 있습니까?

답변

1

정확하게 이해하면 문자열의 숫자가 배열의 Fixnum으로 끝나길 원합니다.

당신은 당신의 split.map를 추가하여이 작업을 수행 할 수 있습니다 : 당신은 정규 표현식으로 String#scan을 사용할 수 있습니다

... .map { |c| c =~ /\d/ ? c.to_i : c } 
4

.

str = "0hh1ghi22d" 

str.scan(/\d+|\D+/).map { |s| s =~ /\d+/ ? s.to_i : s } 
    #=> [0, "hh", 1, "ghi", 22, "d"] 

또는 요구 사항에 따라

str.each_char.map { |s| s =~ /\d/ ? s.to_i : s } 
    #=> [0, "h", "h", 1, "g", "h", "i", 2, 2, "d"] 

.

+0

개별 문자가 필요한 경우 첫 번째 부분 인'chars'도 작동합니다. – tadman

+0

@tadman, 좋은 제안, 그 질문에 대한 명확하지 않습니다. 나는 편집을했다. –

+0

캡처 그룹을 사용하여'\ d +'를 두 번 매칭하지 않아도됩니다 :'str.scan (/ (\ D +) | (\ d +) /). s || (\ d +'와'\ d +'의 순서를 바꾼 것에주의하십시오) – Stefan

관련 문제