2013-03-05 2 views
0

저는 최근에 정규식에서 많은 것을 보았고 두 번째 단어가없는 한 단어의 일치와 관련된 많은 답변을 보았습니다. 나는을 많이 보았다. 주어진 단어 (또는 그 자리에 복잡한 정규 표현식)에 대한 Regex 검색을 할 수 있고 단어가없는 부분을 찾을 수있다.여러 줄 정규식 : B가없는 곳을 찾으십시오.

줄 단위로 작동하는 것처럼 보이지만 여러 줄 모드를 포함하면 여전히 제대로 일치하지 않는 것처럼 보입니다.

Example : 단어 foo이 포함되어 있지만 파일에 단어 bar이없는 전체 파일 문자열과 일치하십시오. 내가 지금까지 가지고있는 것은 example link을 기반으로 한 (?m)^(?=.*?(foo))((?!bar).)*$입니다. 나는 Ruby Regex 테스터로 테스트를 해왔지만, 오픈 엔드 정규 표현식 문제/질문이라고 생각한다. 그것은 작은 조각과 일치하는 것, 나는 하나의 큰 덩어리로 전체 문자열에 일치하거나 일치하지 싶습니다.

위의 예제에서 일치하는 내용은 줄 단위로 나타납니다. ENTIRE 문자열에 적용 할 수 있도록 정규식에 어떤 변경을 가할 필요가 있습니까?

편집 : 나는 정규식을 사용하지 않는이 문제를 해결하는 다른보다 효율적인 방법이 있다는 것을 알고있다. 나는 다른 방법을 사용하여 문제에 대한 해결책을 찾고 있지 않다.의 이론적 인 정규 표현식을 묻는다. 멀티 라인 모드 ("작동")가 있으며, 라인 단위로 조합 할 수있는 부정/긍정 검색이 있습니다.이 두 원칙을 결합하면 예상 결과가 나오지 않습니다.

+3

당신은 무엇 경기 반환을 걱정하지만, 단지 * 일치하는 경우 * 알고 싶어하지 않는 경우, 당신은 간단한 문자열을 사용 할 수 없습니다 검색 기능을 두 번? (하나는'foo'를위한 것이고, 하나는'bar'를위한 것)? – h2ooooooo

+0

유즈 케이스는 Eclipse에서 매우 큰 파일 세트에 있습니다.검색 기능에 내장 된 일식을 사용하면 Regex를 사용하여 파일을 검색 할 수 있습니다. 두 개의 결과 세트를 검색/비교하는 것은 까다로울 것입니다. 정규 표현식을 사용하여 'bar'를 참조하지 않고 'foo'에 관련된 파일 만 찾을 수 있습니다. ("검색> 파일 ..."). 정말 현명한 것입니다. 정규 표현식이없는 현재의 결과와는 달리, 전체 파일 검색을 제공하기 위해 실종 된 정규 표현식이 무엇보다 많습니다. 다른 방법으로 검색 할 수도 있지만 정규 표현식 솔루션을 대상으로합니다. – Walls

+0

나는 끔찍하게 정규식에서 강하지 않다. 그러나 나는 $가 당신이 줄의 끝에 멈추고 있다는 것을 의미한다는 것을 안다. 또한 Ruby \ m에서 끝에있는 정규식을 감쌀 것임을 알고 있습니다. 그것을 넘어서는 정규식을 수정하는 방법, 나는 확실하지 않다 –

답변

2

, 모든 필요할는 긍정적 예측하는 부정적 예측, 당신은 여러 모드에 있기 때문에, .* 나머지를 돌봐 :

/(?=.*foo)(?!.*bar).*/m 

여러 줄이 의미 . 일치 \n 또한, 그리고 성냥은 욕심이 많습니다. 따라서 전체 문자열은 앵커가 필요없이 일치합니다.

업데이트

@Sawa는 \A에 대한 좋은 점은 \Z을 필요되고 있지만합니다. 사실, 다시보고, 긍정적 예측 불필요한 보인다

/\A(?!.*bar).*foo.*/m 
+0

이것도 작동하며 훨씬 깨끗해 보입니다. 감사합니다 – Walls

+0

이것은 작동하지 않습니다. 그것은''bar foo ''의 일부분과 부정확하게 일치합니다. 그래서 내 정규식은 부정적인 선견문이 전체 문자열에 영향을 미치는지 확인하기위한 앵커가있는 이유입니다. – sawa

+0

이번엔 네 말이 맞아. – sawa

2

foo를 포함하지 않는 전체 문자열 일치 정규식은 :

/\A(?!.*foo.*).*\z/m 

bar를 포함하는 전체 문자열의 선두로부터 일치 정규식이다

/\A.*bar/m 

버젼 당신은이 두 가지를 모두 만족시키고 싶습니다. 그 중 하나를 선견자로 두어 이것들을 결합하십시오 :

/\A(?=.*bar)(?!.*foo.*).*\z/m 
사와의 대답은 간단하게 할 수
+0

Perfect! 정확히 내가 무엇을 찾고 있었는지. 멀티 라인 모드를 사용할 때,'\ A'와'\ z'를 사용하여 문자열의 시작/끝을 처리하는 것이 더 낫습니다. 오류는'^'와'$'를 사용했습니다. 감사! 참고 :이 예제는 답변 내용이 뒤집 혔지만, foo를 찾도록 수정하면 bar를 찾지 못합니다. – Walls

관련 문제