2014-02-26 2 views
1

정규식 패턴으로이 문제를 해결하려고합니다.이 솔루션과 함께 테스트를 통과하더라도 배열 내에 ["1", "2"] 만 있어야합니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?Ruby : 구분 기호를 Regex와 일치 시키십시오

IRB 테스트 :

s = "//;\n1;2" # when given a delimiter of ';' 

s2 = "1,2,3" # should read between commas 

s3 = "//+\n2+2" # should read between delimiter of '+' 

s.split(/[,\n]|[^0-9]/) 

=> ["", "", "", "", "1", "2"] 

생산 :

module StringCalculator 
    def self.add(input) 
    solution = input.scan(/\d+/).map(&:to_i).reduce(0, :+) 
    input.end_with?("\n") ? nil : solution 
    end 
end 

시험 :

context 'when given a newline delimiter' do                               
    it 'should read between numbers' do                                
    expect(StringCalculator.add("1\n2,3")).to eq(6)                             
    end                                        

    it 'should not end in a newline' do                                
    expect(StringCalculator.add("1,\n")).to be_nil                             
    end                                        
end 

context 'when given different delimiter' do                               
    it 'should support that delimiter' do                               
    expect(StringCalculator.add("//;\n1;2")).to eq(3)                            
    end                                       
end 
+0

이 단어 ** 수정 **을 작성하고, 새로운 내용을 넣어. 첫 번째 게시물을 삭제하지 마십시오. 당신이 사람들을 제거한다면 나는 * STUPID *라고 생각할 것이고, 당신이 이해하기를 바랍니다. –

+0

알았어. 문제에 대해 좀 더 자세히 살펴 보았다. @ArupRakshit – theGrayFox

+1

1,2,3 "'에 대한 예상 출력은 무엇입니까? –

답변

1

아주 간단한을 사용하여:

s = "//;\n1;2" 
s.scan(/\d/) # => ["1", "2"] 

/\d/ - 디지트 문자 ([0-9])

참고 :

아래 다음과 같은 문자열이있는 경우, /\d+/를 사용해야합니다.

s = "//;\n11;2" 
s.scan(/\d+/) # => ["11", "2"] 
+0

나는 그 일을 처음 해봤지만 문제는 실제로 그 캐릭터들 사이에서 숫자를 읽길 원한다. 나는 내가 haha를 조사하는 것에 바람 피우고있는 것처럼 느낀다. http://osherove.com/tdd-kata-1/ – theGrayFox

+0

솔직하게 말하면'^ 0-9'에서 분할하는 것은'0-9'을 스캔하는 것과 거의 같습니다 ;-) –

+0

@ p11y 아니요 .. see 이 's = "//; \ n11; 2" s.split (/ [^ 0-9] /) # => [ "" "" "" "11", "2" ]'를 지우면 추가 작업을해야합니다. –

1

당신은이 문자열과 같은 데이터를 얻고 : //1\n212

당신이 파일로 데이터를 가져 오는 경우, 두 개의 별도의 라인으로 취급합니다. 문자열이라면 다시 두 줄로 처리하십시오. 두 경우 모두 출력시

//1 
212 

과 같이 표시됩니다.

는 문자열의 경우이 파일의 경우

input = "//1\n212".split("\n") 
delimiter = input.first[2] # => "1" 
values = input.last.split(delimiter) # => ["2", "2"] 

: 당신이 당신의 사후 변경 될 때

line = File.foreach('foo.txt') 
delimiter = line.next[2] # => "1" 
values = line.next.chomp.split(delimiter) # => ["2", "2"] 
+0

'''add()''클래스 메소드로 작성한 모듈은 그냥 문자열을 전달합니다. 비록 이것이 스펙에서 다루지는 않았지만, 나는 모든 것을 끝내기를 원한다. 이 문제에 대한 테스트를 작성하지는 않았지만 이런 상황이 발생할 때 오류가 발생할 수 있다고 생각합니다. 통찰력에 감사드립니다. – theGrayFox

관련 문제