영어 원문은 Smashing Magazine 에서 나왔습니다. Benhuoer 가 번역했습니다. 재배포시 출처를 꼭 밝혀주세요.
정규식(Regular Expression, 약어: regex)은 강력하며 큰 문자열에서 필요한 정보를 찾는 데 사용할 수 있습니다. 일반적인 문자 구조 표현을 사용하여 작업합니다. 불행하게도 간단한 정규식은 일부 고급 응용 프로그램에서는 충분히 강력하지 않습니다. 필터링 구조가 더 복잡한 경우 고급 정규식을 사용해야 할 수도 있습니다.
이 기사에서는 정규식의 고급 기술을 소개합니다. 우리는 일반적으로 사용되는 8가지 개념을 선별하고 예제를 통해 분석했습니다. 각 예제는 특정 복잡한 요구 사항을 충족하는 간단한 작성 방법입니다. 정규화의 기본 개념에 대한 이해가 여전히 부족하다면 먼저 이 문서, 이 튜토리얼 또는 Wiki 항목을 읽어보세요.
여기의 일반 구문은 PHP에 적합하며 Perl과 호환됩니다.
1. 탐욕/게으름
여러 번 자격을 얻을 수 있는 정규 운영자는 모두 욕심쟁이입니다. 가능한 한 많은 대상 문자열과 일치합니다. 즉, 일치 결과가 최대한 길어집니다. 불행하게도 이 접근 방식이 항상 우리가 원하는 것은 아닙니다. 따라서 문제를 해결하기 위해 "lazy" 한정자를 추가합니다. 각 탐욕 연산자 뒤에 "?"를 추가하면 표현식이 가능한 가장 짧은 길이만 일치하게 됩니다. 또한 수정자 "U"는 여러 번 정규화할 수 있는 연산자를 지연화할 수도 있습니다. 탐욕스러운 것과 게으른 것의 차이를 이해하는 것이 고급 정규 표현식을 사용하는 기초입니다.
탐욕스러운 운영자
* 연산자는 이전 표현식과 0회 이상 일치합니다. 욕심쟁이 운영자입니다. 다음 예를 참조하세요.
preg_match( '/<h1>.*< /h1>/', '</h1><h1>제목입니다.</h1>
<h1>이것은 또 다른 것입니다. </h1>', $matches );
마침표(.)는 개행 문자를 제외한 모든 문자를 나타낼 수 있습니다. 위의 정규식은 h1 태그 및 태그 내의 모든 항목과 일치합니다. 마침표(.)와 별표(*)를 사용하여 태그 내의 모든 항목을 일치시킵니다. 매칭 결과는 다음과 같습니다.
<h1>제목입니다. </h1>
<h1>이것은 또 다른 것입니다. </h1>
전체 문자열이 반환됩니다. * 연산자는 행의 모든 항목과 일치합니다. 심지어 중간에 닫는 h1 태그도 일치합니다. 욕심이 많기 때문에 전체 문자열을 일치시키는 것은 이익 극대화 원칙에 부합합니다.
게으른 운영자
위 수식을 약간 수정하고 물음표(?)를 추가하여 표현식을 게으르게 만듭니다.
/<h1>.*?< /h1>/</h1>
이러한 방식으로 작업을 완료하려면 첫 번째 h1 종료 태그만 일치하면 된다고 느낄 것입니다.
비슷한 속성을 가진 또 다른 욕심 많은 연산자는 {n,}입니다. 이전 일치 패턴이 n번 이상 반복된다는 의미입니다. 물음표가 추가되지 않으면 최대한 많은 반복을 찾습니다. (물론 "반복"입니다. n회'가 최소입니다.)
#문자열 생성
$str = '안녕하세요 죄송합니다';
# 일치를 위해 탐욕스러운 {n,} 연산자를 사용합니다.
preg_match( '/(hi){2,}/', $str, $matches ) # match[0]는 'hihihi'가 됩니다.
# 일치시키기 위해 저하된 {n,} 연산자를 사용합니까?
preg_match( '/(hi){2,}?/', $str, $matches ) # match[0]는 'hihi'가 됩니다.
출처 : 멍청한 일