2012-08-08 4 views
15

내가 큰 텍스트가 하위 문자열없이 문자열을 찾을 :정규 표현식 :

"Big piece of text. This sentence includes 'regexp' word. And this 
sentence doesn't include that word" 

내가 ''로 시작하고 '단어'로 끝나는 문자열을 찾을 필요가 있지만이 하지 않습니다 단어 'regexp'을 포함하십시오.

이 경우 문자열 : "this sentence doesn't include that word"이 정확히 수신하고 싶습니다.

어떻게하면 정규식을 통해이를 수행 할 수 있습니까?

+0

귀하의 규칙이 혼란 스럽거나 예상 한 결과물에 실수를 한 것입니다. 왜 "그리고"그리고 왜 "텍스트의 큰 조각." – sjakubowski

+0

@sjakubowski "하위 문자열은 'this'로 시작하고 'word'로 끝납니다." – Mathletics

+0

이 규칙은 혼란 스럽지만 정확합니다. 나는 구글에서 무언가를 찾는데 많은 시간을 보냈지 만 아무것도 발견하지 못했다. – Artem

답변

27

을 경우 무시 옵션을 사용하면 다음과 같은 작업을해야합니다 :

\bthis\b(?:(?!\bregexp\b).)*?\bword\b 

예 : http://www.rubular.com/r/g6tYcOy8IT

설명 :

\bthis\b   # match the word 'this', \b is for word boundaries 
(?:    # start group, repeated zero or more times, as few as possible 
    (?!\bregexp\b) # fail if 'regexp' can be matched (negative lookahead) 
    .     # match any single character 
)*?    # end group 
\bword\b   # match 'word' 

\b 각 단어를 둘러싼는 '말의'에서 '엉겅퀴', 또는 '단어'의 '이'일치와 같은 문자열에 일치하지 않는 것을 확인합니다.

시작 단어와 끝 단어 사이의 각 문자를 확인하여 제외 된 단어가 나타나지 않는지 확인합니다.

+2

정확히 내가 필요한 것입니다! 고맙습니다! – Artem

+2

+1 정규 표현식에 대한 좋은 설명과 그걸 가지고 놀기위한 링크를 위해 +1 - 나는 이것을 비슷한 것으로 적용 할 수 있었고 설명없이 고투했을 것이다. 나는 그것이 작동하는 방법을 말하지 않고 단지 약간의 코드를주는 대답에 지긋 지긋합니다. –

+0

당신은 나를 많이 도왔습니다! 감사! –

3

미리보기 assays를 사용하십시오. 당신이 문자열이 다른 문자열을 포함하지 않는 경우 검사 할 때

, 당신은 쓸 수 있습니다 :

/^this(?!.*substring).*word$/ 
:

/^(?!.*substring)/ 

당신은 또한 시작과 thisword에 대한 라인의 끝을 확인해야합니다

여기 또 다른 문제는 문자열 찾기를하지 않으면 문장을 찾을 수 있다는 것입니다.

그래서 해결책은 다음과 같습니다 : 사용의

perl -e ' 
    local $/; 
    $_=<>; 
    while($_ =~ /(.*?[.])/g) { 
    $s=$1; 
    print $s if $s =~ /^this(?!.*substring).*word[.]$/ 
    };' 

예 :

$ cat 1.pl 
local $/; 
$_=<>; 
while($_ =~ /(.*?[.])/g) { 
    $s=$1; 
    print $s if $s =~ /^\s*this(?!.*regexp).*word[.]/i; 
}; 

$ cat 1.txt 
This sentence has the "regexp" word. This sentence doesn't have the word. This sentence does have the "regexp" word again. 

$ cat 1.txt | perl 1.pl 
This sentence doesn't have the word. 
+0

그 겉만 그 표정만으로는 업무를 수행 할 수 없습니다. 중첩 된 미리보기를 사용해야합니다. 그리고 뒤 따르는 코드 스 니펫은 아무런 설명없이 읽기가 어렵습니다 (필자는 Perl을 모른다). :/ – KRyan

+0

@DragoonWraith : 너 무슨 소리 야? 이 영혼은 그 일을 해결해줍니다. 너 스스로해볼 수있어. –

+0

RegEx 게시를 시도했지만 그렇게하지 않았습니다. '(?!'는 부분 문자열이'단어'다음에 나타나는 경우에도 부분 문자열이'this' 다음에 나오는 경우와 일치하지 않게합니다 (예제에서). 중첩 된'(? :(?!'FJ ' 님의 대답이이 문제를 해결합니다.나는 그 조각을 테스트 할 수있는 Perl을 가지고 있지 않지만, 그것을보고 무엇을 배우지 않고, 어쨌든 RegEx 솔루션이 아니라고 말할 수있는 것으로부터, 수동으로 문자열을 걷고있는 것처럼 보이기 때문에 그 while 루프. 이 질문은 '펄'이 아닌 '정규식'태그가 붙어 있습니다. – KRyan