정규식 소개 및 구문
정규 표현식을 사용하는 이유는 무엇인가요?
일반적인 검색 및 바꾸기 작업을 수행하려면 예상 검색 결과와 일치하는 정확한 텍스트를 제공해야 합니다. 이 기술은 정적 텍스트에 대한 간단한 검색 및 바꾸기 작업을 수행하는 데 충분할 수 있지만 유연성이 부족하여 이러한 방식으로 동적 텍스트 검색이 불가능하지는 않더라도 어렵습니다.
정규식을 사용하면 다음을 수행할 수 있습니다.
1. 문자열 내의 패턴을 테스트합니다.
예를 들어 입력 문자열을 테스트하여 전화번호 패턴이나 신용카드 번호 패턴이 문자열 내에 나타나는지 확인할 수 있습니다. 이를 데이터 유효성 검사라고 합니다.
2. 텍스트를 교체합니다.
정규 표현식을 사용하면 문서의 특정 텍스트를 식별하거나, 해당 텍스트를 완전히 제거하거나, 다른 텍스트로 바꿀 수 있습니다.
3. 패턴 일치를 기반으로 문자열에서 하위 문자열을 추출합니다.
문서나 입력란 내에서 특정 텍스트를 찾을 수 있습니다.
예를 들어 전체 사이트를 검색하고, 오래된 자료를 제거하고, 특정 HTML 형식 태그를 교체해야 할 수도 있습니다. 이 경우 정규식을 사용하여 이 자료 또는 HTML 형식 태그가 각 파일에 나타나는지 여부를 확인할 수 있습니다. 이 프로세스는 영향을 받는 파일 목록을 제거하거나 변경해야 하는 자료가 포함된 파일로 범위를 좁힙니다. 그런 다음 정규식을 사용하여 오래된 자료를 제거할 수 있습니다. 마지막으로 정규식을 사용하여 태그를 검색하고 바꿀 수 있습니다.
정규식 - 구문
정규식(정규식)은 문자열 일치 패턴을 설명합니다. 이 패턴은 문자열에 특정 하위 문자열이 포함되어 있는지 확인하고 일치하는 하위 문자열이 있는지 확인하는 데 사용할 수 있습니다. 문자열 등에서 특정 조건을 충족하는 부분 문자열을 추출합니다.
디렉토리를 나열할 때 dir *.txt 또는 ls *.txt의 *.txt는 정규식이 아닙니다. 여기서 *의 의미는 정규식의 *와 다르기 때문입니다.
정규식을 구성하는 것은 수학 표현식을 만드는 것과 같습니다. 즉, 작은 표현식을 함께 결합하여 다양한 메타 문자와 연산자를 사용하여 더 큰 표현식을 만들 수 있습니다. 정규식의 구성 요소는 단일 문자, 문자 모음, 문자 범위, 문자 간 선택 항목 또는 이러한 구성 요소 모두의 조합일 수 있습니다.
정규 표현식은 일반 문자(예: a~z 문자)와 특수 문자('메타 문자'라고 함)로 구성된 리터럴 패턴입니다. 패턴은 텍스트를 검색할 때 일치시킬 하나 이상의 문자열을 설명합니다. 정규식은 검색된 문자열과 문자 패턴을 일치시키는 템플릿 역할을 합니다.
일반 문자
일반 문자에는 메타 문자로 명시적으로 지정되지 않은 인쇄 가능한 문자와 인쇄 불가능한 문자가 모두 포함됩니다. 여기에는 모든 대문자와 소문자, 모든 숫자, 모든 구두점 및 일부 기타 기호가 포함됩니다.
인쇄되지 않는 문자
인쇄되지 않는 문자도 정규식의 일부가 될 수 있습니다. 다음 표에는 인쇄할 수 없는 문자를 나타내는 이스케이프 시퀀스가 나열되어 있습니다.
문자설명
cx 일치 x 지정된 제어 문자. 예를 들어, cM은 Control-M 또는 캐리지 리턴 문자와 일치합니다. x 값은 A-Z 또는 a-z 중 하나여야 합니다. 그렇지 않으면 c는 리터럴 'c' 문자로 처리됩니다.
f는 폼 피드와 일치합니다. x0c 및 cL과 동일합니다.
n은 개행 문자와 일치합니다. x0a 및 cJ와 동일합니다.
r은 캐리지 리턴 문자와 일치합니다. x0d 및 cM과 동일합니다.
s는 공백, 탭, 폼 피드 등을 포함한 모든 공백 문자와 일치합니다. [fnrtv]와 동일합니다.
S는 공백이 아닌 모든 문자와 일치합니다. [^ fnrtv]와 동일합니다.
탭 문자와 일치하지 않습니다. x09 및 cI와 동일합니다.
v는 세로 탭 문자와 일치합니다. x0b 및 cK와 동일합니다.
특수문자
소위 특수문자는 위에서 언급한 "*.txt"의 *와 같이 특별한 의미를 지닌 문자입니다. , 간단히 말하면 모든 문자열의 의미를 의미합니다. 파일 이름에 *가 있는 파일을 찾으려면 *를 이스케이프 처리해야 합니다. 즉, 앞에 *를 추가해야 합니다. ls*.txt.
많은 메타문자를 일치시키려면 특별한 처리가 필요합니다. 이러한 특수 문자를 일치시키려면 먼저 문자를 "이스케이프"해야 합니다. 즉, 문자 앞에 백슬래시 문자()를 와야 합니다. 다음 표에는 정규식의 특수 문자가 나열되어 있습니다.
특수 문자설명
$ 입력 문자와 일치합니다. 문자열의 끝 위치. RegExp 개체의 Multiline 속성이 설정된 경우 $는 'n' 또는 'r'과도 일치합니다. $ 문자 자체를 일치시키려면 $를 사용하십시오.
( ) 하위 표현식의 시작과 끝을 표시합니다. 나중에 사용하기 위해 하위 표현식을 얻을 수 있습니다. 이러한 문자를 일치시키려면 ( 및 )를 사용하십시오.
* 이전 하위 표현식과 0회 이상 일치합니다. * 문자를 일치시키려면 *를 사용하십시오.
+ 이전 하위 표현식과 한 번 이상 일치합니다. + 문자를 일치시키려면 +를 사용하십시오.
. 개행 문자 n을 제외한 모든 단일 문자와 일치합니다. .을 일치시키려면 .을 사용하십시오.
[ 대괄호 표현식의 시작을 표시합니다. [를 일치시키려면 [를 사용하십시오.
? 앞의 하위 표현식을 0 또는 1번 일치시키거나 탐욕스럽지 않은 한정자를 지정합니다. ? 문자를 일치시키려면 ?를 사용하십시오.
다음 문자를 특수 문자, 리터럴 문자, 역참조 또는 8진수 이스케이프 문자로 표시합니다. 예를 들어 'n'은 문자 'n'과 일치합니다. 'n'은 개행 문자와 일치합니다. 시퀀스 '\'는 ""와 일치하고 '('는 "("와 일치합니다.
^은 대괄호 표현식에 사용되지 않는 한 입력 문자열의 시작과 일치합니다. 이 경우 문자는 다음과 같습니다. 허용되지 않는 컬렉션입니다. ^ 문자를 일치시키려면 |를 사용하세요.
한정자는 다음과 같습니다. 정규식의 특정 구성 요소가 일치를 충족하려면 몇 번 나타나야 하는지 지정하는 데 사용됩니다. 정규식 한정자에는 *, +, ?, {n}, {n,} 또는 {n, m}. >
문자설명
* 이전 하위 표현식과 0번 이상 일치합니다. 예를 들어 zo*는 "z와 일치할 수 있습니다. ". 및 "zoo". * {0,}와 동일합니다.
+는 이전 하위 표현식과 한 번 이상 일치합니다. 예를 들어 'zo+'는 "zo" 및 " Zoo와 일치합니다. ", 그러나 "z"와 일치할 수 없습니다. + {1,}과 동일합니다.? 앞의 하위 표현식과 0 또는 1번 일치합니다. 예를 들어 "do(es)?"는 "do " 또는 "do"와 일치합니다. "does"에서.?{n} n은 음수가 아닌 정수입니다. 예를 들어 'o{2}'는 '와 일치할 수 없습니다. 'Bob'에서는 o'를 사용하지만 'food'에서는 두 개의 o를 일치시킬 수 있습니다
.
{n,} n은 음이 아닌 정수입니다. n번 이상 일치합니다. 예를 들어 'o{2,}'는 "Bob"의 'o'와 일치하지 않지만 "foooood"의 모든 o와 일치합니다. 'o{1,}'는 'o+'와 동일합니다. 'o{0,}'는 'o*'와 동일합니다.
{n,m} m과 n은 모두 음수가 아닌 정수입니다. 여기서 n <= m입니다. 최소 n회, 최대 m회 일치합니다. 예를 들어, "o{1,3}"은 "fooooood"의 처음 세 개의 o와 일치합니다. 'o{0,1}'은 'o?'와 동일합니다. 쉼표와 두 숫자 사이에는 공백이 있어서는 안 됩니다.
큰 입력 문서에서는 장 수가 9개를 초과할 가능성이 높으므로 두 자리 또는 세 자리의 장 번호를 처리하는 방법이 필요합니다. 예선전은 이 능력을 제공합니다. 다음 정규식은 자릿수에 상관없이 장 제목과 일치합니다.
/Chapter [1-9][0-9]*/
한정자는 범위 표현식 뒤에 나타납니다. 따라서 전체 범위 표현에 적용됩니다. 이 경우 0부터 9까지의 숫자만 적용됩니다.
여기서는 두 번째 이후 위치에 반드시 숫자가 올 필요는 없기 때문에 + 한정자를 사용하지 않습니다. 그것도 안쓰나요? 장 번호를 두 자리로 제한하기 때문입니다. 장 뒤에 숫자 하나 이상과 공백 문자가 일치해야 합니다.
장 번호가 99장으로 제한되어 있다는 것을 알고 있는 경우 다음 표현식을 사용하여 최소 1자리, 최대 2자리를 지정할 수 있습니다.
/Chapter [0-9]{1,2}/
위 표현식의 단점은 여전히 더 큰 장 번호만 일치한다는 것입니다. 99보다 처음 두 자리입니다. 또 다른 단점은 챕터 0도 일치한다는 것입니다. 두 자리 숫자만 일치시키는 더 나은 표현은 다음과 같습니다:
/Chapter [1-9][0-9]?/
또는
/Chapter [1-9][0-9]{0,1}/
*, + 및 ? 한정자는 모두 탐욕적입니다. 단어 뒤에 ?를 추가하면 가능한 한 많은 단어를 사용하거나 욕심이 없거나 최소한의 일치를 얻을 수 있습니다.
예를 들어 HTML 문서에서 H1 태그로 묶인 장 제목을 검색할 수 있습니다. 문서의 텍스트는 다음과 같습니다.
1장 – 정규식 소개
다음 표현식은 Everything과 일치합니다. 여는 보다 큼 기호(<)부터 닫는 H1 태그의 보다 큼 기호(>)까지입니다.
/<.*>/
여는 H1 태그만 일치시키면 다음 "non-greedy" 표현식만 일치합니다.
/<.*?>/
*, + 또는 뒤에 ?를 추가하면 표현이 "greedy"에서 "greedy"로 변경됩니다. ? 한정자 표현식은 "탐욕스럽지 않은" 표현식 또는 최소 일치로 변환됩니다.
위치 찾기
로케이터를 사용하면 정규식을 줄의 시작이나 끝 부분에 고정할 수 있습니다. 또한 단어 내, 단어 시작 부분 또는 단어 끝 부분에 나타나는 정규식을 생성할 수도 있습니다.
위치 지정자는 문자열이나 단어의 경계를 설명하는 데 사용되며, ^와 $는 각각 문자열의 시작과 끝을 나타내고, b는 단어의 앞이나 뒤 경계를 나타내며, B는 비단어 경계.
정규 표현식의 한정자는 다음과 같습니다:
문자설명
^ 입력과 일치 문자 문자열의 시작 위치입니다. RegExp 개체의 Multiline 속성이 설정된 경우 ^는 n 또는 r 다음의 위치와도 일치합니다.
$ 입력 문자열의 끝과 일치합니다. RegExp 개체의 Multiline 속성이 설정된 경우 $는 n 또는 r 앞의 위치와도 일치합니다.
b 단어 경계, 즉 단어와 공백 사이의 위치와 일치합니다.
B 비단어 경계 매칭.
참고: 한정자는 앵커 포인트와 함께 사용할 수 없습니다. 개행 또는 단어 경계 바로 앞이나 뒤에는 두 개 이상의 위치가 있을 수 없으므로 ^*와 같은 표현은 허용되지 않습니다.
텍스트 줄 시작 부분의 텍스트를 일치시키려면 정규 표현식 시작 부분에 ^ 문자를 사용하세요. ^의 사용과 대괄호 표현식 내부의 사용을 혼동하지 마십시오.
텍스트 줄 끝의 텍스트를 일치시키려면 정규 표현식 끝에 $ 문자를 사용하세요.
장 제목을 검색할 때 기준점을 사용하기 위해 다음 정규 표현식은 후행 숫자 두 개만 포함하고 줄 시작 부분에 나타나는 장 제목과 일치합니다.
/^ 장 [1-9][0-9]{0,1}/
실제 장 제목은 줄의 시작 부분에 나타날 뿐만 아니라 유일한 제목이기도 합니다. 줄에 텍스트가 있습니다. 줄의 시작 부분과 같은 줄의 끝 부분에 모두 나타납니다. 다음 표현식은 지정된 일치 항목이 상호 참조가 아닌 장과만 일치하는지 확인합니다. 텍스트 줄의 시작과 끝만 일치하는 정규식을 만들어 이를 수행할 수 있습니다.
/^Chapter [1-9][0-9]{0,1}$/
일치 단어 경계는 약간 다르지만 일반에 가깝습니다. 표현식은 중요한 기능을 추가합니다. 단어 경계는 단어와 공백 사이의 위치입니다. 단어가 아닌 경계는 다른 위치입니다. 다음 표현식은 단어 경계 뒤에 세 문자가 나타나기 때문에 Chapter라는 단어의 처음 세 문자와 일치합니다.
/bCha/
b 문자 위치는 다음과 같습니다. 매우 중요합니다. 일치할 문자열의 시작 부분에 있는 경우 단어의 시작 부분에서 일치 항목을 찾습니다. 문자열 끝에 있으면 단어 끝에서 일치하는 항목을 찾습니다. 예를 들어, 다음 표현식은 Chapter라는 단어의 문자열 ter가 단어 경계 앞에 나타나기 때문에 일치합니다.
/terb/
다음 표현식 Chapter의 문자열 apt와 일치하지만 aptitude의 문자열 apt와는 일치하지 않습니다:
/Bapt/
문자열 apt는 Chapter라는 단어에서는 단어가 아닌 경계에 나타나지만 aptitude라는 단어에서는 단어 경계에 나타납니다. B 비단어 경계 연산자의 경우 일치 항목이 단어의 시작인지 끝인지 상관하지 않으므로 위치는 중요하지 않습니다.
선택
모든 선택 항목을 괄호로 묶고, 인접한 선택 항목은 |로 구분합니다. 그러나 괄호를 사용하면 부작용이 발생합니다. 즉, 관련 일치 항목이 캐시됩니다. 이 경우 첫 번째 옵션 앞에 ?:를 사용하면 이 부작용을 제거할 수 있습니다.
그 중 ?:는 비캡처 요소 중 하나이고, 나머지 두 비캡처 요소는 ?= 및 ?!입니다. 이 두 가지는 더 많은 의미를 갖습니다. 임의 시작 검색 문자열은 괄호 안의 정규식 패턴의 모든 위치에서 일치됩니다. 이는 정규식 패턴과 일치하지 않는 임의의 초기 위치에서 검색 문자열과 일치하는 부정 예측입니다.
역참조
정규 표현식 패턴이나 패턴의 일부 주위에 괄호를 추가하면 관련 일치 항목이 임시 버퍼에 저장됩니다. 캡처된 각 부분 일치는 정규식 패턴에 나타나는 순서대로 왼쪽에서 오른쪽으로 저장됩니다. 버퍼 번호는 1부터 시작하며 최대 99개의 캡처된 하위 표현식을 저장할 수 있습니다. 각 버퍼는 'n'을 사용하여 액세스할 수 있습니다. 여기서 n은 특정 버퍼를 식별하는 한 자리 또는 두 자리 십진수입니다.
비캡처 메타문자 '?:', '?=' 또는 '?!'를 사용하여 캡처를 재정의할 수 있으며 관련 일치 항목 저장을 무시합니다.
역참조의 가장 간단하고 유용한 응용 프로그램 중 하나는 텍스트에서 인접한 두 개의 동일한 단어의 일치 항목을 찾는 기능입니다. 다음 문장을 예로 들어 보겠습니다.
휘발유 가격이 올라가나요?
위 문장에는 분명히 여러 단어가 반복됩니다. 각 단어의 반복을 찾을 필요 없이 이 문장을 찾는 방법을 고안하는 것이 좋을 것입니다. 다음 정규 표현식은 단일 하위 표현식을 사용하여 이를 달성합니다.
/b([a-z]+) 1b/gi
캡처된 표현식 지정된 수식 [a-z]+로, 하나 이상의 문자로 구성됩니다. 정규 표현식의 두 번째 부분은 이전에 캡처된 부분 일치에 대한 참조입니다. 즉, 대괄호 표현식과 정확히 일치하는 단어의 두 번째 발생입니다. 1은 첫 번째 부분 일치를 지정합니다. 단어 경계 메타 문자는 전체 단어만 감지되도록 합니다. 그렇지 않으면 "발행됨" 또는 "이것은"과 같은 문구가 이 표현으로 올바르게 인식되지 않습니다.
정규 표현식 뒤의 전역 태그(g)는 입력 문자열에서 찾을 수 있는 최대 일치 항목에 표현식이 적용되도록 지시합니다. 표현식 끝에 있는 대소문자를 구분하지 않는(i) 태그는 대소문자를 구분하지 않음을 지정합니다. 여러 줄 태그는 개행 문자의 양쪽에서 발생할 수 있는 잠재적 일치 항목을 지정합니다.
또한 역참조는 URI(Universal Resource Indicator)를 해당 구성 요소로 분류합니다. 다음 URI를 프로토콜(ftp, http 등), 도메인 주소 및 페이지/경로로 나누고 싶다고 가정해 보겠습니다.
http://www.w3cschool.cc:80/html/html-tutorial .html
다음 정규식은 이 기능을 제공합니다.
/(w+)://([^/:]+)(:d*)?([^# ]*)/
첫 번째는 대괄호 하위 표현식은 웹 주소의 프로토콜 부분을 캡처합니다. 이 하위 표현식은 앞에 콜론과 두 개의 슬래시가 오는 모든 단어와 일치합니다. 두 번째 괄호 하위 표현식은 주소의 도메인 주소 부분을 캡처합니다. 하위 표현식은 / 및 :를 제외한 하나 이상의 문자와 일치합니다. 세 번째 괄호 하위 표현식은 포트 번호(지정된 경우)를 캡처합니다. 이 하위 표현식은 콜론 다음에 오는 0개 이상의 숫자와 일치합니다. 이 하위 표현식은 한 번만 반복될 수 있습니다. 마지막으로 네 번째 대괄호 하위 표현식은 웹 주소로 지정된 경로 및/또는 페이지 정보를 캡처합니다. 이 하위 표현식은 # 또는 공백 문자를 포함하지 않는 모든 문자 시퀀스와 일치합니다.
위의 URI에 정규 표현식을 적용하면 각 하위 일치에는 다음이 포함됩니다.
1) 대괄호로 묶인 첫 번째 하위 표현식에는 "http"가 포함됩니다.
2) 두 번째 대괄호 하위 표현식에는 다음이 포함됩니다. "www.w3cschool.cc"
3) 세 번째 대괄호 하위 표현식에는 ":80"이 포함됩니다.
4) 네 번째 대괄호 하위 표현식에는 "../html/html-tutorial.html이 포함됩니다. "
atoms
Atom은 정규식에서 가장 작은 단위입니다. 직설적으로 말하면 Atom이 일치해야 합니다. 내용. 유효한 정규 표현식에는 하나 이상의 원자가 포함되어야 합니다.
설명: 우리가 보는 공백, 캐리지 리턴, 줄 바꿈, 0-9, A-Za-z, 중국어, 구두점 및 특수 기호는 모두 원자입니다.
원자적 예제를 수행하기 전에 먼저 preg_match 함수를 설명하겠습니다.
int preg_match ( string $regular, string $string[, array &$result] )
함수: $regular 변수를 기준으로 $string 변수를 일치시킵니다. 존재하는 경우 일치 항목 수를 반환하고 일치된 결과를 $result 변수에 넣습니다. 결과가 없으면 0이 반환됩니다.
시작 및 끝
^은 시작을 의미하고, $는 끝을 의미합니다
코드는 날짜
$str = 'date20150121';
if (preg_match(' /^)로 시작하는 모든 숫자와 일치할 수 있습니다. date/', $str)) {
echo '일치 성공';
} else {
echo '일치 실패';
}
w문자 일치에 사용 , 숫자 또는 밑줄 문자
d는
$str = 'date20150121'을 나타내는 숫자(D는 숫자가 아닌 문자를 나타냄)와 일치합니다. >
if (preg_match('/^w/', $str, $matches)) {
print_r($matches);
} else {
echo '일치 실패';
}
특별히 표시된 원자
Atom설명
d 일치 0-9
D 0-9를 제외한 모든 문자
w a-zA-Z0-9_
W 0-9A를 제외한 모든 문자 - 모든 문자 Except -Za-z_
s 모든 공백 문자와 일치 n t r 공백
S 공백이 아닌 모든 문자와 일치
[ ] 원자 범위 지정
예:
d는 0-9와 일치합니다
D가 0~9 이외의 값과 일치합니다.
성공적으로 경기가 진행됩니다. 0~9 사이의 문자가 아니기 때문입니다.
w는 a-zA-Z0-9_
와 일치합니다일치가 성공적이며 밑줄이 일치합니다.
W가 a-zA-Z0-9_
와 일치하지 않았습니다. 왜냐하면 위의 내용은 모두 a-zA-Z0-9_이고, a-zA-Z0-9_가 아닌 것은 없기 때문입니다.
s는 모든 공백 문자 n t r 공백과 일치합니다.
는 캐리지 리턴이 있으므로 성공적으로 일치합니다.
S개의 비어 있지 않은 문자
가 성공적으로 일치합니다. 공백이 있더라도 캐리지 리턴 및 들여쓰기가 수행됩니다. 그러나 공백이 아닌 문자 a가 있습니다. 따라서 경기는 성공합니다.
[] 지정된 범위의 Atoms
결론:
위의 예에서 0~5는 $string과 일치하지 못했지만 $string1은 일치했습니다. 왜냐하면 $string의 첫 번째 값은 6이며 이는 [0-5] 범위에 속하지 않습니다.
결론:
$string과 $string1은 모두 성공적으로 일치합니다. w는 [a-zA-Z0-9_]
결론:
$string, $string1, $string2는 성공적으로 일치했지만 $string3은 실패했습니다. $string3이 [abc]의 범위를 초과하므로 d부터 시작됩니다.
[^ 문자]는 지정된 범위의 문자와 일치하지 않습니다.
결론:
1) $string 일치에서는 실패했지만, $string1 일치에서는 성공했습니다. 대괄호 안에 곡절 기호가 있기 때문입니다.
2) ^ 대괄호 안의 곡절 문자의 기능은 대괄호 안의 문자와 일치하지 않습니다.