2010-08-17 6 views
2

Ruby에서 작업하고 텍스트 파일에서 작업 할 필드와이 정규 표현식을 사용하는 다른 사람의 보석과 함께 작업하면서 다음 작업에 대해 하나의 정규 표현식을 만들어야합니다. 문자열의 시작, 문자 세트 및 밑줄, 그리고 1,2,9 또는 10이 아닌 다중 숫자 정수 및 문자열의 끝과 일치해야합니다.Ruby에서 일부 문자열을 제외하고 패턴과 일치하는 정규 표현식을 만드는 방법은 무엇입니까?

foo_4 
bar_8 
baz_120 

하지만하지 않음 :
즉, 나는 다음과 일치 할

foo_1 
bar_9 
baz_10 

내가

/^.+_(^(1|2|9|10))$/ 

을 시도했지만 작동하지 않았다 같은 분명히 ^는 문자를 "부정" 괄호 안에, 서브 미팅이 아니다.

+1

안녕하세요. 이것은 Stack Overflow에 대한 첫 번째 질문이기 때문에 여기에서 "잘 쓰여진"것으로 간주되는 질문처럼 보이도록 편집했습니다. 제발, 더 일반적인 단어 (내가 쓴 제목을 확인하여 문제를 설명하려고), 다른 사람들이 귀하의 질문을 검색하고 같은 문제가 발생하면 재사용 할 수 있습니다. 또한 좋은 포맷팅이 성공의 열쇠이기 때문에 포맷팅에주의하십시오 (팁을 읽고 편집 페이지에서'? '를 클릭하십시오). 즉, SO에 오신 것을 환영합니다! –

+0

"** 문자열 **의 시작 부분과 일치"또는 "** 라인 ** 시작 부분과 일치"를 의미합니까? 입력에 새로운 행이 포함될 수 있다면 차이가 있습니다. –

+0

그래서 끝 정수는 여러 자리수 여야합니다. 맞습니까? 그렇다면 1, 2 또는 9를 확인할 필요가 없습니다. 내가 쓰기 표현을 찾으려고하지만, 나는 정규 표현식에서 newby이다. 편집 : 나는 당신이 당신의 포스트를 편집 했었던이 시간을 끝내자. :) – XstreamINsanity

답변

5

문자 클래스의 바깥 쪽 ^ 기호는 줄의 시작을 의미합니다. 난 당신이 대신 negative lookahead 싶은 생각 :

/^.+_(?!(?:1|2|9|10)$)\d+$/ 

rubular에 행동을 참조하십시오.

+3

'^'는 줄의 시작이 아니라 문자열의 시작을 의미합니다. '\ A '는 문자열의 시작을 의미합니다. –

+3

번호. '^'** 항상 **는 다중 행 일치를 수행하기 위해'm' 플래그를 사용하는지 여부에 관계없이 행의 시작을 의미합니다. 일치하는 문자열에 개행 문자가없는 경우에만 차이를 무시할 수 있습니다. –

+0

@Ken Bloom : 미안 해요, 당신 말이 맞아요. 루비에서 항상 시작을 의미합니다. (대부분의 다른 정규 표현식 엔진에서 ^는 문자열의 시작을 의미하고 루비는 동일하다고 가정했습니다.) 내 게시물을 수정했습니다. 너무 영속적이되어서 고마워! –

관련 문제