프로그래밍 언어/HTML,CSS,JS

단어가 포함되지 않은 줄과 일치하는 정규식

Rateye 2021. 12. 16. 09:43
728x90
반응형
질문 : 단어가 포함되지 않은 줄과 일치하는 정규식

grep -v )를 사용하여 일치를 반전시킬 수 있다는 것을 알고 있습니다. 그러나 정규 표현식을 사용하여 hede )를 포함하지 않는 행을 일치시킬 수 있습니까?

입력 :

hoho
hihi
haha
hede

 코드 : 

grep "<Regex for 'doesn't contain hede'>" input

 

출력 :

hoho
hihi
haha
답변

정규식이 역 일치를 지원하지 않는다는 개념은 전적으로 사실이 아닙니다. 부정적인 둘러보기를 사용하여이 동작을 모방 할 수 있습니다.

^((?!hede).)*$

위의 정규식은 (하위) 문자열 'hede'를 포함 하지 않는 모든 문자열 또는 줄 바꿈이없는 행과 일치합니다. 언급 한 바와 같이,이 정규식에서 "좋은"(또는해야 할) 것이 아닙니다,하지만 여전히, 그것은 가능하다.

줄 바꿈 문자도 일치시켜야하는 경우 DOT-ALL 수정 자 ( s )를 사용하십시오.

/^((?!hede).)*$/s

또는 인라인으로 사용하십시오.

/(?s)^((?!hede).)*$/

(여기서 /.../ 는 정규식 구분 기호, 즉 패턴의 일부가 아님)

DOT-ALL 수정자를 사용할 수없는 경우 문자 클래스 [\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). 볼 수있는 하위 문자열 "hede" 가 없는지 미리 살펴보고 그럴 경우 (다른 것을 볼 수 있음) . (점)은 줄 바꿈을 제외한 모든 문자와 일치합니다. 둘러보기는 문자를 사용 하지 않기 때문에 너비가 0 인 어설 션이라고도합니다. 그들은 단지 무언가를 주장 / 검증합니다.

그래서, 제 예에서, 모든 빈 문자열은 먼저 문자를 사용하기 전에 앞에 "hede" . (점). 정규식 (?!hede). 한 번만 수행하므로 그룹으로 래핑되고 0 회 이상 반복됩니다 : ((?!hede).)* . 마지막으로 입력의 시작과 끝이 고정되어 전체 입력이 소비되도록합니다. ^((?!hede).)*$

당신이 볼 수 있듯이, 입력 "ABhedeCD" 때문에 실패합니다 e3 , 정규 표현식 (?!hede) 실패 (가 "hede" 까지 앞으로!).

출처 : https://stackoverflow.com/questions/406230/regular-expression-to-match-a-line-that-doesnt-contain-a-word
728x90
반응형