Regular Expressions
정규식 함정
수색…
왜 줄 문자 (.)가 줄 바꿈 문자 ( "\ n")와 일치하지 않습니까?
.*
정규식에서 기본적으로 "입력 끝날 때까지 모든 것을 잡는다"는 의미입니다.
그래서 hello world
와 같은 간단한 문자열의 경우 .*
가 완벽하게 작동합니다. 그러나 파일에 줄을 나타내는 문자열이 있으면이 줄은 유닉스 계열 시스템에서 \n
(줄 바꿈)과 같은 줄 구분 기호로 구분 되고 \r\n
(캐리지 리턴 및 줄 바꿈)은 Windows.
대부분의 regex 엔진에서는 기본적으로 .
개행 문자와 일치 하지 않으므로 각 논리 행 의 끝에서 일치가 중지됩니다. 원한다면 .
줄 바꿈을 포함하여 모든 것을 실제로 일치 시키려면 정규식 엔진에서 "도트 일치 전체"모드를 re.DOTALL
합니다 (예 : Python의 re.DOTALL
플래그 추가 또는 PCRE의 /s
추가).
정규식은 왜 닫는 대괄호 / 괄호를 건너 뛰고 이후에 일치합니까?
다음 예제를 고려하십시오.
그는 카페 "Dostoevski"에 들어가서 말했다 : "안녕하세요."
여기에 두 세트의 따옴표가 있습니다. 우리가 정규 표현식이 "Dostoevski"
와 "Good evening."
"Dostoevski"
에서 일치 할 수 있도록 양쪽을 일치 시키려고한다고 가정 해 봅시다 "Good evening."
처음에는 간단하게 유혹을받을 수 있습니다.
".*" # matches a quote, then any characters until the next quote
그러나 작동하지 않습니다. "Dostoevski"
의 첫 번째 인용구와 "Good evening."
의 마감일 까지 일치합니다 "Good evening."
the and said:
the and said:
부분을 포함하여. Regex101 데모
왜 그런 일이 일어 났습니까?
이는 정규 표현식 엔진이 .*
만날 때 맨 끝까지 모든 입력을 "먹는다"때문에 발생 .*
. 그런 다음, 최종 일치해야합니다 "
. 그래서, 그것은" "첫까지 일치하는 텍스트의 놓아, 경기의 끝에서 떨어져 백업을 "
발견 - 그리고, 물론, 마지막 "
경기 "Good evening."
의 마지막 부분.
이를 방지하고 첫 번째 따옴표와 정확히 일치시키는 방법은 무엇입니까?
사용 [^"]*
은 모든 입력을 먹지 않습니다. - 첫 번째 때까지 "
, 필요한 것처럼. Regex101 데모