2012-07-13 3 views
0

그래서 정규식을 사용하여 Black Magic을 발명했습니다. 일부 커맨드 라인 인수를 구문 분석하려고하는데, 어떤 형식의 인수도 받아 들여야합니다. test[somethinginhere] 여기서 'somethinginhere'는 실행할 테스트의 이름입니다.Ruby Regex Black Magic

이것은 코드의 모양입니다. 더 많은 코드가 실제로 후 부울과 기능을 수행하지만, 이것은 인수를 처리하는 부분입니다. 이 프로그램은 소문자 's'를 포함하지 않는 모든 테스트 이름을 제대로 실행됩니다 : 검은 마법이 들어오는 곳

ARGV.each do |arg| 
    case arg.downcase 
     when "help" 
      @help = true 
     when "install" 
      @install = true 
     when "deploy" 
      @deploy = true 
     when "configure" 
      @configure = true 
     when /^test\[([a-z]+)\]$/ 
      @test << arg.downcase[/^test\[([a-z]+)\]$/,1] 
     else 
      @usage = true 
    end 

end 

지금 여기.

$ ./AutoTest.rb test[a] 
Running Test "ATest" 

$ ./AutoTest.rb test[b] 
Running Test "BTest" 

$ ./AutoTest.rb test[anything] 
Running Test "AnythingTest" 

다음은 실패합니다 : 다음은 통과 할 것이다

$ ./AutoTest.rb test[s] 

Usage: AutoTest [help|install|deploy|configure|test[*]] 

을하지만이 통과 할 것이다 :

는 사실
$ ./AutoTest.rb test[S] 

Running Test "STest" 

, 그것의 소문자의 내부에 아무것도 실패합니다

$ ./AutoTest.rb test[user] 

Usage: AutoTest [help|install|deploy|configure|test[*]] 

대문자 : 다음에 올 수

$ ./AutoTest.rb test[uSer] 

Running Test "UserTest" 

유일한 결론이 정규식 마술의 비밀에 탭 가공이되어,이 시점에서 그것도 자신에 HTML을 구문 분석 할 수 있도록 강력한되고 있다는 점이다.

하지만 진지하게, 여기서 무슨 일이 벌어지고 있습니까?

답변

3

소문자 s가있는 대괄호는 bash에서 특별한 의미가 있습니다. 나는 다음을 수행하여이 문제를 발견 : 이것은 적용

$ echo test[S] 
test[S] 

$echo test[s] 
tests 

아직도이 검은 마법에서 오는 아무 생각

$echo test[user] 
tests 

$echo test[uSer] 
test[uSer] 

괄호 아무 곳이야,하지만 내 문제에 대한 해결책입니다 더 이상 대괄호를 사용하지 않습니다.

+0

아마 좋은 생각이다. 이것은'!'에서')'까지 * shifted-number * 부서의 거의 모든 것을 포함합니다. 왜 더 일반적인'--test = s' 나'test s' 타입의 문법을 사용하지 않을까요? – tadman

+0

'test s'는 사용자가 여러 명령을 함께 묶을 수있게 허용하지 않기 때문에 작동하지 않습니다. './AutoTest.rb install deploy config config-all'을 실행하십시오. 그래서 나는 돌진과 함께 갈거야. –

+0

여러 부분 인수를 처리 할 수 ​​있도록 인수 파서를 다시 작성하면 작동합니다. 반면에'rake'를 예로 들자면'rake db : migrate'와 같이':'을 구분 기호로 사용하는 것이 좋습니다. – tadman

1

이 시도 :

./AutoTest.rb "테스트 [사용자]"또한 쉘에 대해 특별한 의미가 명령 행에서 문자의 어떤 종류를 사용

+0

잘 작동하는 것 같습니다. 하지만 매번 따옴표를 써야하기를 원하지 않기 때문에'test [*]'대신'test- *'를 받아들이도록 스크립트를 조정하고 있습니다. –