스택큐힙리스트

특정 단어를 포함하지 않는 줄에 대해 일치하는 정규식 본문

카테고리 없음

특정 단어를 포함하지 않는 줄에 대해 일치하는 정규식

스택큐힙리스트 2023. 3. 21. 20:35
반응형

해당 단어를 매치하고 다른 도구 (예 : grep -v)를 사용하여 일치를 뒤집는 것이 가능하다는 것을 알고 있습니다. 그러나 정규 표현식을 사용하여 특정 단어가 포함되지 않은 줄을 매칭하는 것은 가능한가요? (예 : hede)

Sorry, there is no input provided to translate to Korean. Please provide the input.

hoho

hihi

haha

hede

코드:

grep input

희망하는 출력:

hoho

hihi

haha

답변 1

정규표현식은 역매칭을 지원하지 않는다는 개념은 완전한 것이 아닙니다. 부정적인 전방 탐색을 사용하여 이 동작을 모방할 수 있습니다.

^((?!hede).)*$

위의 정규식은 줄바꿈이 없는 어떤 문자열이나 줄을 'hede' (부분)문자열을 포함하지 않는 것과 일치합니다. 위에서 언급했듯이, 이것은 정규식이 잘하는 것이 아니며 (해야할 일도 아닙니다), 그럼에도 불구하고, 가능합니다.

그리고 줄 바꿈 문자를 매칭해야한다면, 다음 패턴에서 맨 끝의 s DOT-ALL modifier (을 사용하세요).

/^((?!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

(?!hede). 라는 정규 표현식은 hede 이라는 부분 문자열이 없으면 (다른 것이 보인다면), . (점)은 줄 바꿈을 제외한 모든 문자와 일치합니다. 룩어라운드는 문자를 소비하지 않기 때문에 zero-width-assertions (제로 너비 단언)이라고도합니다. 그들은 무엇인가를 주장 / 확인하기 만합니다. 여기서 e 's이 빈 문자열임을 유의하세요.

그래서 내 예시에서, 모든 빈 문자열은 먼저 hede 앞에 아무것도 없는지 유효성을 확인한 후, 문자가 . (점)에 의해 소비되기 전에 유효성을 검사합니다. 그것을 한 번만 수행하는 정규식 (?!hede). 가 그룹으로 묶여 제로 이상 반복됩니다. 마지막으로, 입력의 시작과 끝이 고정되어 전체 입력이 소비되도록합니다. ^((?!hede).)*$

보시는 대로, 입력 ABhedeCD은 e3에서 정규 표현식 (?!hede)이 실패하기 때문에 실패합니다 (앞에는 hede이 있습니다!).

답변 2

정규 표현식(Regular expression)은 텍스트 데이터를 처리하고, 검색하거나 변경하기 위한 문자열 패턴을 지정하는 방법입니다. 한편, 일반적인 경우에서는 문자열이 특정 단어를 포함하는지를 확인하는 정규 표현식을 자주 사용합니다. 그러나 때로는 반대로 어떤 단어가 없는 문자열을 찾아야 할 경우도 있습니다.

예를 들어, 웹사이트에서 페이지의 로그인 양식을 찾으려면, 로그인 양식이 아닌 부분을 찾아야 합니다. 이 때 '로그인'이라는 단어가 없는 부분을 찾아서 로그인 양식이 아님을 확인할 수 있습니다.

이와 같은 경우에는 부정적 룩어헤드(Negative Lookahead)를 사용합니다. 부정적 룩어헤드는 문자열의 일부를 찾을 때 그 문자열 뒤에 특정 패턴이 없는 경우에만 검색을 수행합니다.

다음은 부정적 룩어헤드를 사용하여 '로그인'이라는 단어가 없는 줄을 찾는 정규 표현식입니다.

^(?!.*로그인).*$

이 정규 표현식은 다음과 같이 해석됩니다.

^ : 문장의 시작을 나타냅니다.

(?!.*로그인) : '로그인'이라는 패턴이 없는 경우에만 일치합니다.

.* : 아무 문자(공백 포함)나 0개 이상이 들어갈 수 있습니다.

$ : 문장의 끝을 나타냅니다.

이 정규 표현식은 텍스트 데이터를 처리하고, 검색하거나 변경하기 위한 매우 유용한 방법입니다. 더불어 검색 엔진 최적화를 위해서도 좋은 방법입니다. 정규식을 적용하여 원하는 결과물을 찾을 수 있으며, 검색 결과가 정확해지는 만큼 검색 엔진에서의 노출되는 페이지의 순위도 상승할 것입니다.

따라서, 부정적 룩어헤드를 활용한 정규 표현식은 웹 개발에서 필수적인 기술 중 하나입니다. 주어진 문제를 해결하고, 검색 엔진 최적화를 위한 방법으로 사용할 수 있으며, 기술의 다른 분야에서도 유용하게 사용될 수 있습니다.

반응형
Comments