2012-04-27 5 views
9

레일스 앱에서 문자열의 단어가 아닌 문자를 제거하려면 gsub을 사용하려고했습니다. 나는 다음과 같은 코드를 사용 :gssub와의 괴도

somestring.gsub(/[\W]/i, '') #=> "" 

을하지만 실제로는 잘못된 것입니다, 그것은뿐만 아니라 편지 k을 제거합니다.

somestring.gsub(/\W/i, '') #=> "kkk" 

하지만 내 문제는 RSpec에 작동하지 않는 사용하여 위의 코드를 포함하는 레일 컨트롤러의 단위 테스트는 단위 테스트가 실제로 전달하는 것입니다 : 올바른 일을해야한다. 그래서 나는 RSpec에

it "test this gsub" do 
    'kkk'.gsub(/[\W]/i, '').should == 'kkk' 
end 

위의 테스트 케이스가 실패 할 경우에 매우 극단적 인 테스트 케이스를 만들었지 만 실제로 전달합니다. 여기에 어떤 문제가 있습니까? 왜 시험은 통과할까요?

+2

왜 테스트가 실패합니까? '/ [\ W]/i'는 제가 볼 수있는 한 그 작업을위한 완전히 유효한 정규 표현식입니다. 이 경우 대괄호는 불필요하지만 아무런 상처를주지는 않습니다. –

+0

실제로 irb에서 정규 표현식을 사용해 보셨습니까? ''kkk ''.gsub (..)'그것은 잘 작동하고 결과는 "kkk"이므로 테스트가 통과됩니다. 기대하고있는 결과는 무엇입니까? – Casper

+1

@Casper 실제로''kkk'.gsub (/ [\ W]/i, '')'를 실행하면''''이됩니다. 비교해 보면''kkk '.gsub (/ \ W/i,' ')'를 실행하면''kkk''가 반환됩니다. –

답변

5

Ruby 1.9가 동작 변경을 설명하는 다른 정규식 엔진 (Oniguruma)으로 전환되었습니다. 이것은 그것의 버그처럼 보입니다. 귀하의 예를 들어

, 당신은 대소 문자를 구분 일치를 지정하지 않음으로써 문제를 해결 얻을 수 있습니다 :

irb(main):001:0> 'kkk'.gsub(/[\W]/i, '') 
=> "" 
irb(main):002:0> 'kkk'.gsub(/[\W]/, '') 
=> "kkk" 
irb(main):004:0> 'kkk'.gsub(/\W/i, '') 
=> "kkk" 
irb(main):003:0> 'kkk'.gsub(/\W/, '') 
=> "kkk" 

업데이트 : 그것은 문자 그룹이 다른 접근 방식이다 제거하는 것 같습니다. 문자 그룹에서 반드시 일치하지 않는 부정적인 일치가있을 수 있습니까?

+0

당신은 그렇게 생각하지 않습니까? 그것은 불가능합니다 ... 대문자와 소문자가 구별되기 때문에'\ W'을 (를) 가져 와서 '\ w'로 만듭니다. 실제로 그렇게 할 수는 없습니다. 그렇죠 ?? O_O –

+0

나는 희망하지 않는다. 그러나 당신은 결코 모른다. 이것은 아마도 http://bugs.ruby-lang.org에서 제기되어 비난의 원인을 확인할 수 있습니다. – Nevir

+0

http://www.rubular.com/ 버그가 확인되었습니다. 1.8.7과 1.9.2 사이를 전환하여 차이점을 확인할 수 있습니다. – Casper