2014-06-23 1 views
0

을 문자열을 분할하고 적용하려고 :내가 문자열이 대체 접미사

str='SA201406005/007/009/010' 

방법이 결과를 얻을 수 있습니까?

['SA201406005','SA201406007','SA201406009', 'SA201406010'] 

이 코드는 작동합니다

arr=[] 
arr=str.split(/\//) 
arr=arr[1..-1].map{|x|x=arr[0].slice(0,arr[0].size-arr[-1].size)+x}.unshift(arr[0]) 

그것을 할 수있는 쉬운 방법이 있나요? 이 방법에 대해

+2

'010'은 무엇입니까? 그 결과에 없어야한다는 규칙은 무엇입니까? – spickermann

+0

@spickermann 질문의 코드에 결과에 _010_ 문자열이 포함되어 있습니다. 단순한 것 같아서 질문을 수정했습니다. –

답변

1

는 :

str = 'SA201406005/007/009/010' 
prefix, suffixes = str[0..7], str[8..-1] 
suffixes.split('/').map { |s| prefix + s } 
# => ["SA201406005", "SA201406007", "SA201406009", "SA201406010"] 

이 접두사는 항상 8 자입니다 가정합니다.

+0

str [8 ..- 1]은 8에서 문자를 시작한다는 것을 이해함을 의미하지만 -1은 무엇을 의미합니까? –

+1

문자열 인덱스가 루비로 둘러싸여 있습니다. 따라서'[0]'이'S'이면'[-1]'은'0'이됩니다. 그것은 문자열의 끝을 의미합니다. – Cereal

+0

@ 시리얼 : 고맙습니다. –

2

이 코드는 기본 또는 접미사의 하나의 길이에 대한 어떠한 가정도하지 않습니다 :

def apply_suffixes(s) 
    base, *suffixes = s.split("/") 
    [base] + suffixes.map do |suffix| 
    base[0...-suffix.length] + suffix 
    end 
end 

p apply_suffixes("SA201406005/007/009/010") 
# => ["SA201406005", "SA201406007", "SA201406009", "SA201406010"] 

한 가지 흥미로운 부분은 다음과 같습니다

base, *suffixes = s.split("/") 

destructuring bind를 사용한다.

또한 흥미로운 :

0...-suffix.length 

는 "..."OPERATOR 시스템은 최대 제외 범위를 productes. 0...-suffix.length0..(-suffix.length-1)과 같습니다.

6
a = str.split("/") 
a.map{|s| s.rjust(a.first.length, a.first)} 
# => ["SA201406005", "SA201406007", "SA201406009", "SA201406010"] 
+2

정말 멋지 네요! –

+0

우수한 코드, 감사합니다! – bluexuemei