단어가 포함되지 않은 줄과 일치하는 정규 표현식
질문
나는 다른 도구 (예를 들어, grep -v)를 사용하여 단어를 일치시키고 일치하는 것을 반대 할 수 있다는 것을 알고 있습니다.그러나 특정 단어를 포함하지 않는 선을 일치시킬 수 있습니다.HEETHE, 정규 표현식을 사용하여?
입력:
hoho
hihi
haha
hede
암호:
grep "<Regex for 'doesn't contain hede'>" input
원하는 출력 :
hoho
hihi
haha
답변
정규식 일치를 지원하지 않는 개념은 완전히 사실이 아닙니다.부정적인 룩 주위를 사용 하여이 동작을 모방 할 수 있습니다.
^((?!hede).)*$
비 캡처 변형 :
^(?:(?!:hede).)*$
위의 정규식은 (하위) 문자열 'HEEDE'를 포함하지 않은 줄 바꿈없이 모든 문자열을 일치시킵니다.언급 한 바와 같이, 이것은 정규식이 "좋은"것이 아니라 (또는해야 할 것), 여전히 가능하지는 않습니다.
그리고 회선 브레이크 문자와 일치 해야하는 경우 도트 - 모든 수정 자 (다음 패턴에서 후행 S)를 사용하십시오.
/^((?!hede).)*$/s
또는 IT 인라인을 사용하십시오 :
/(?s)^((?!hede).)*$/
(/.../은 정규식 구분 기호, 즉 패턴의 일부가 아닌 경우)
도트 - 모든 수정자를 사용할 수없는 경우 문자 클래스 [\ s \ s]와 동일한 동작을 모방 할 수 있습니다.
/^((?!hede)[\s\S])*$/
설명
문자열은 n 자의 목록 일뿐입니다.각 문자가 끝나면 빈 문자열이 있습니다.그래서 n 문자 목록은 n + 1 개의 빈 문자열을 갖습니다."abhedecd"문자열을 고려하십시오.
┌──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┐
S = │e1│ A │e2│ B │e3│ h │e4│ e │e5│ d │e6│ e │e7│ C │e8│ D │e9│
└──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┘
index 0 1 2 3 4 5 6 7
E가 빈 문자열 인 곳입니다.정규 표현식 (?! hede).Substring "Heede"가 없는지 확인하기 위해 보이고, 그 경우 (그래서 다른 것이 보이는 것), 그렇다면.(점)은 줄 바꿈을 제외한 모든 문자와 일치합니다.모든 문자를 소비하지 않기 때문에 뷰 주위가 제로 폭 - 어설 션이라고도합니다.그들은 뭔가를 주장 / 유효성을 검사합니다.
따라서 예에서는 캐릭터가 소비되기 전에 모든 빈 문자열을 먼저 유효성으로 확인합니다.(점).정규 표현식 (?! hede).한 번만 할 수 있으므로 그룹에 싸여 있고 0 이상을 반복합니다. (((?! hede)) *.마지막으로, 시작 및 종료 입력은 전체 입력이 소비되는지 확인하기 위해 고정되어 있습니다. ^ ((Heede)) * $
볼 수 있듯이 "abhedecd"는 E3에서 regex (? hede)가 실패하기 때문에 입력 "abhedecd"가 실패합니다 ( "hede"앞에 있습니다!).
답변
"HEEDE"로 시작하지 않는 해결책은 다음과 같습니다.
^(?!hede).*$
일반적으로 "HEEDE"가 포함되어 있지 않은 해결책보다 훨씬 효율적입니다.
^((?!hede).)*$
전자는 모든 위치가 아닌 입력 문자열의 첫 번째 위치에서만 "HEEDE"를 확인합니다.
답변
GREP에 대해 사용하는 경우 GREP -V HEEDE를 사용하여 HEETH를 포함하지 않는 모든 라인을 얻을 수 있습니다.
eta 오, 질문을 다시 읽고, grep -v는 아마도 당신이 "도구 옵션"을 의미하는 것일 수 있습니다.
답변
답변:
^((?!hede).)*$
설명:
^ 문자열의 시작, (그룹 및 캡처 \ 1 (0 개월 이상 가능), 가능하다), (?!가 없는지,
끈 당신의 문자열,
) 앞으로의 끝, ...에\ n, ) * \ 1의 끝 (참고 :이 캡처에서 수량화자를 사용하고 있기 때문에 캡처 된 패턴의 마지막 반복 만 \ 1에 저장됩니다) 선택적 \ n 및 문자열의 끝에서 $
답변
주어진 답변은 완벽하게 괜찮습니다.
이론 컴퓨터 과학의 의미에서 정규 표현식은 이렇게 할 수 없습니다.그 (것)들을 위해, 이것과 같이 보이는 것을보아야했다 :
^([^h].*$)|(h([^e].*$|$))|(he([^h].*$|$))|(heh([^e].*$|$))|(hehe.+$)
이것은 전체 일치 만 수행합니다.하위 경기를 위해 그것을하는 것은 더 어색합니다.
답변
전체 문자열이 일치하면 정규식 테스트 만 실패하게하려면 다음 작업이 작동합니다.
^(?!hede$).*
예를 들어,- "foo"(i.e. "foofoo", "barfoo"및 "foobar"를 제외한 모든 값을 허용하려는 경우 "foo"가 실패합니다), 사용 : ^ (foo $). *
물론 정확한 평등을 검사하는 경우이 경우에 더 나은 일반적인 솔루션은 문자열 평등을 확인하는 것입니다.
myStr !== 'foo'
Regex 기능이 필요한 경우 테스트 외부에서 부정을 넣을 수도 있습니다 (여기서는 대소 문자 무감율 및 범위 일치).
!/^[a-f]oo$/i.test(myStr)
그러나이 답변 상단의 정규식 솔루션은 긍정적 인 정규식 테스트가 필요한 상황에서 도움이 될 수 있습니다 (API가 아마도).
출처:https://stackoverflow.com/questions/406230/regular-expression-to-match-a-line-that-doesnt-contain-a-word
최근댓글