질문 : 단어가 포함되지 않은 줄과 일치하는 정규식
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
'프로그래밍 언어 > HTML,CSS,JS' 카테고리의 다른 글
[Javascript] html 클래스가 포함되어 있는지 확인하는 방법 (0) | 2022.01.06 |
---|---|
JavaScript에서 HTTP GET 요청 하는 방법 (0) | 2021.12.19 |
null 또는 빈 컬렉션을 반환하는 것이 효율적인가? (0) | 2021.12.16 |
자바스크립트 문자열의 첫 번째 문자를 얻는 방법 (0) | 2021.12.16 |
JavaScript를 사용하여 문자열에서 공백을 제거하는 방법 (0) | 2021.12.15 |