2011-11-23 2 views
0

가능한 한 적은 코드로 Ruby 문제를 해결하려고합니다. :). 주어진 문자열이 다양한 수의 기호로 시작하는지 확인하고 싶습니다. 하나와 3 사이에 'a'라고 말하면됩니다. reg exp를 사용하면 간단합니다. string.match (\^a {1,3}. * \)를 쓸 수 있습니다. 그러나 그 다음에 정확한 a의 수에 따라 문자열을 변경해야합니다. 어떻게 그런의 경우 세 가지를 사용하지 않고이를 감지 할 수 있습니다 : 사전에문자열의 시작 부분에 주어진 기호의 정확한 숫자 찾기

do_string_manipulation1 if string.match(/^a.*/) 
do_string_manupulation2 if string.match(/^aa.*/) 
... 

감사합니다 :)

답변

1

왜 첫 번째 정규 표현식의 수정 된 버전을 사용하지 다음 단순히 A는 그것을 반환의 계산? 당신은 또한 루틴을 저장하는 배열을 사용할 수 있습니다 물론 알라

m = string.match(/^(a{1,3})/) 
case m[1].size 
    when 1 
    when 2 
    when 3 
end 

는 수에 따라 호출 :

routines = [nil, method(:do_string_manipulation1), method(:do_string_manipulation2), ...] 
routines[m[1].size].call 
+0

감사합니다. '일치'가 무엇인지 알 수 없습니다. – mjekov

+0

여기에 설명 된대로 MatchData 객체입니다. http://rubydoc.info/stdlib/core/1.9.3/MatchData –

+0

또는 = ~ 연산자를 사용하고 전역 변수 $ 1 (이 경우 일반적으로 $ 1 .. $ n)입니다. 그 이점은 MatchData 객체를 만들지 않아도되므로 더 빠릅니다. –

1

은 문자열 조작이 무엇인지에 따라 달라집니다.

당신은 수행하여 연속 A의 수를 확인할 수 있습니다

string.match(/^(a{1,3}).*/)[1].size 

을 당신은 나의 있도록하고, 규칙을 정의하지 않은 :

"a" - downcase 
"aa" - reverse 
"aaa" - swapcase 

그래서 내 코드는 다음과 같습니다

string.send([:downcase, :reverse, :swapcase][string.match(/^(a{1,3}).*/)[1].size-1]) 

규칙이 더 복잡하면 클래스의 메소드로 정의하고 th에 따라 호출 할 수 있습니다 전자 번호가 반환되었습니다.

관련 문제