2012-10-31 2 views
11

"문자 클래스 오류 빈 범위"정규 표현식 내가 URL의 패턴과 일치하는 것입니다 내 코드에서 정규식을 얻고 오류가 발생했습니다

/^(http|https):\/\/([\w-]+\.)+[\w-]+([\w- .\/?%&=]*)?$/ 

이 오류는 "문자 클래스 오류 빈 범위"이었다 . 그 원인은 ([\w- .\/?%&=]*)? 부분에있는 것으로 나타났습니다. 루비는 - 대신에 범위의 연산자로 에 -을 인식하는 것으로 보입니다. 돌진에 탈출구를 추가 한 후 문제가 해결되었습니다.

그러나 원본 정규 표현식은 동료의 컴퓨터에서 잘 실행되었습니다. 우리는 osx, 레일 및 루비의 동일한 버전을 사용합니다 : 루비 버전은 루비 1.9.3p194, 레일은 3.1.6, osx는 10.7.5입니다. 그리고 Heroku 서버에 코드를 배포 한 후에도 모든 것이 잘 작동했습니다. 왜 내 환경에서만이 정규식에 관한 오류가 있었습니까? Ruby 정규식 해석의 메커니즘은 무엇입니까?

+5

는 잘 모르겠지만, 문자 클래스에 하이픈해야 항상 이스케이프 또는 문자 클래스의 시작 또는 끝에 있어야합니다. 그렇지 않으면 엔진이 범위를 만들기로 결정할 수 있습니다. 하이픈은 다른 범위 (예 :'[A-Z -_]') 바로 뒤에 허용되지만 이는 너무 낙담합니다. –

+2

Ruby의 어떤 버전입니까? 정규식 지원이 포함 된 이전 버전입니까? 최소한 버전 관리, OS 등 관련 세부 사항을 제공하지 않으면 도움이되지 않습니다. –

+0

도움을 주셔서 감사합니다. Dave에게 : 루비 버전은 루비 1.9.3p194, 레일은 3.1.6, osx는 10.7.5입니다. 내 루비가 다른 선택적인 정규 표현식 지원을 제공하는지 잘 모르겠다. 생각 좀 나누어 주시겠습니까? – Steve

답변

13

이 오류는 rvm 1.13.4를 사용하여 Ubuntu 12.04.1 LTS에 설치된 Ruby 1.9.3p194 (2012-04-20 revision 35410) [i686-linux]에서 복제 할 수 있습니다. 그러나 이것은 버전 특정 오류가 아니어야합니다. 사실, 다른 컴퓨터에서 작동하는 것이 놀랍습니다.

정당한뿐만 아니라 실패 간단한 데모 : [\w- ]는 "다양한 공간 (또는 공백)까지의 모든 단어 문자로 시작"으로 해석되기 때문에

"abcd" =~ /[\w- ]/ 

이것은 오히려 문자 클래스보다 단어, 하이픈 또는 공백이 포함되어 있습니다.

Per Ruby's regular expression documentation

:

Within a character class the hyphen (-) is a metacharacter denoting an inclusive range of characters. [abcd] is equivalent to [a-d]. A range can be followed by another range, so [abcdwxyz] is equivalent to [a-dw-z]. The order in which ranges or individual characters appear inside a character class is irrelevant.

하면 따라서, 문자 클래스의 범위에서 정규 표현식의 성격을 변경하는 오류를 제거, 백 슬래시는 하이픈을 탈출 붙일 본 것처럼. 그러나 문자 클래스의 중간에 하이픈을 이스케이프하는 것은 권장하지 않습니다. 하이픈의 의도 된 의미를 혼동하기 쉽기 때문입니다. m.buettner가 지적한 바와 같이, 항상 시작 또는 문자 클래스의 한쪽 끝 하이픈을 넣가 아닌 다른에 하나 개의 시스템에 근무하는 이유

"abcd" =~ /[-\w ]/