정규식 - 구문
정규식(정규식)은 문자열 일치 패턴을 설명하며, 이는 문자열에 특정 하위 문자열이 포함되어 있는지 확인하거나, 일치하는 하위 문자열을 바꾸거나, 특정 조건 하위 문자열을 충족하는 문자열에서 추출하는 데 사용할 수 있습니다.
디렉토리를 나열할 때 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]。 |
t | 匹配一个制表符。等价于 x09 和 cI。 |
v | 匹配一个垂直制表符。等价于 x0b 和 cK。 |
특수 문자
소위 특수 문자는 위에서 언급한 "*.txt"의 *와 같이 특별한 의미를 갖는 문자로, 단순히 문자열의 의미를 의미합니다. 파일 이름에 *가 있는 파일을 찾으려면 *를 이스케이프 처리해야 합니다. 즉, 앞에 *를 추가해야 합니다. ls*.txt.
많은 메타문자를 일치시키려면 특별한 처리가 필요합니다. 이러한 특수 문자를 일치시키려면 먼저 문자를 "이스케이프"해야 합니다. 즉, 문자 앞에 백슬래시 문자()를 와야 합니다. 다음 표에는 정규식의 특수 문자가 나열되어 있습니다.
特别字符 | 描述 |
---|---|
$ | 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 'n' 或 'r'。要匹配 $ 字符本身,请使用 $。 |
( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。 |
* | 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。 |
+ | 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。 |
. | 匹配除换行符 n之外的任何单字符。要匹配 .,请使用 。 |
[ | 标记一个中括号表达式的开始。要匹配 [,请使用 [。 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?。 |
将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'n' 匹配换行符。序列 '\' 匹配 "",而 '(' 则匹配 "("。 | |
^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 ^。 |
{ | 标记限定符表达式的开始。要匹配 {,请使用 {。 |
| | 指明两项之间的一个选择。要匹配 |,请使用 |。 |
한정자
한정자는 일치 항목을 충족하기 위해 정규 표현식의 특정 구성 요소가 몇 번이나 나타나야 하는지 지정하는 데 사용됩니다. 6가지 유형이 있습니다: *, +, ?, {n}, {n,} 또는 {n,m}.
정규식의 한정자는 다음과 같습니다.
字符 | 描述 |
---|---|
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 |
? | 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。 |
{n} | 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}/
*입니다. + 및 ? 한정자는 가능한 한 많은 리터럴과 일치한다는 점에서 모두 탐욕적입니다. A ? -탐욕스러운 또는 최소 일치.
예를 들어 HTML 문서에서 H1 태그 안에 포함된 장 제목을 검색할 수 있습니다. 해당 텍스트는 문서에서 다음과 같습니다.
<H1>Chapter 1 – Introduction to Regular Expressions</H1>
아래 표현식은 시작 작은 기호(<)부터 닫는 H1 태그의 보다 큼 기호(>)까지 모든 항목과 일치합니다.
/<.*>/
시작 H1 태그만 일치시키면 아래의 "non-greedy" 표현은 <H1>만 일치합니다.
/<.*?>/
*, + 또는 ? 한정자 뒤에 ?를 배치하면 표현식이 "탐욕스러운" 표현식에서 "비 탐욕스러운" 표현식 또는 최소 일치로 변환됩니다.
로케이터
로케이터를 사용하면 정규식을 줄의 시작이나 끝 부분에 고정할 수 있습니다. 또한 단어 내, 단어 시작 부분 또는 단어 끝 부분에 나타나는 정규식을 생성할 수도 있습니다.
위치자는 문자열 또는 단어의 경계를 설명하는 데 사용됩니다. ^ 및 $는 각각 문자열의 시작과 끝을 나타내며, b는 단어의 앞 또는 뒤 경계를 나타내며, B는 단어가 아닌 경계를 나타냅니다. .
정규식의 한정자는 다음과 같습니다.
字符 | 描述 |
---|---|
^ | 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 n 或 r 之后的位置匹配。 |
$ | 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 n 或 r 之前的位置匹配。 |
b | 匹配一个字边界,即字与空格间的位置。 |
B | 非字边界匹配。 |
Note: 앵커 포인트에는 한정자를 사용할 수 없습니다. 개행 또는 단어 경계 바로 앞이나 뒤에는 두 개 이상의 위치가 있을 수 없으므로 ^*와 같은 표현은 허용되지 않습니다.
텍스트 줄 시작 부분의 텍스트를 일치시키려면 정규식 시작 부분에 ^ 문자를 사용하세요. ^의 사용과 대괄호 표현식 내부의 사용을 혼동하지 마십시오.
텍스트 줄 끝의 텍스트를 일치시키려면 정규 표현식 끝에 $ 문자를 사용하세요.
장 제목을 검색할 때 앵커 포인트를 사용하기 위해 다음 정규식은 후행 숫자 두 개만 포함하고 줄의 시작 부분에 나타나는 장 제목과 일치합니다.
/^Chapter [1-9][0-9]{0,1}/
실제 장 제목은 장 제목의 시작 부분에만 나타나지 않습니다. line 이며 해당 줄의 유일한 텍스트입니다. 줄의 시작 부분과 같은 줄의 끝 부분에 모두 나타납니다. 다음 표현식은 지정된 일치 항목이 상호 참조가 아닌 장과만 일치하는지 확인합니다. 텍스트 줄의 시작과 끝만 일치하는 정규식을 만들어 이를 수행할 수 있습니다.
/^Chapter [1-9][0-9]{0,1}$/
단어 경계 일치는 약간 다르지만 정규 표현식에 중요한 기능을 추가합니다. 단어 경계는 단어와 공백 사이의 위치입니다. 단어가 아닌 경계는 다른 위치입니다. 다음 표현식은 단어 경계 뒤에 세 문자가 나타나기 때문에 Chapter라는 단어의 처음 세 문자와 일치합니다.
/\bCha/
b 문자의 위치는 매우 중요합니다. 일치할 문자열의 시작 부분에 있는 경우 단어의 시작 부분에서 일치 항목을 찾습니다. 문자열 끝에 있으면 단어 끝에서 일치하는 항목을 찾습니다. 예를 들어, 다음 표현식은 단어 Chapter의 문자열 ter가 단어 경계 앞에 나타나기 때문에 일치합니다.
/ter\b/
다음 표현식은 Chapter의 문자열 apt와 일치하지만 aptitude의 문자열 apt와는 일치하지 않습니다.
/\Bapt/
문자열 apt가 발생합니다. Chapter라는 단어에서는 단어가 아닌 경계에 있지만 aptitude라는 단어에서는 단어 경계에 있습니다. B 비단어 경계 연산자의 경우 일치 항목이 단어의 시작인지 끝인지 상관하지 않으므로 위치는 중요하지 않습니다.
Select
모든 선택 항목을 괄호로 묶고 인접한 선택 항목을 |로 구분하세요. 그러나 괄호를 사용하면 부작용이 발생합니다. 즉, 관련 일치 항목이 캐시됩니다. 이 경우 첫 번째 옵션 앞에 ?:를 사용하면 이 부작용을 제거할 수 있습니다.
그 중 ?:는 비캡처 요소 중 하나이고 나머지 두 비캡처 요소는 ?= 및 ?!입니다. 이 두 가지는 더 많은 의미를 가지며 전자는 순방향 조회이며 괄호 안의 모든 항목과 일치합니다. 정규식 패턴은 정규식 패턴과 일치하지 않는 모든 위치의 검색 문자열과 일치합니다. 후자는 정규식 패턴과 일치하지 않는 모든 초기 위치의 검색 문자열과 일치하는 부정 예측입니다.
역참조
정규식 패턴이나 패턴의 일부 주위에 괄호를 추가하면 관련 일치 항목이 임시 버퍼에 저장되며 캡처된 각 하위 일치 항목은 정규식 패턴에서 왼쪽에서 오른쪽으로 표시되는 순서대로 저장됩니다. 버퍼 번호는 1부터 시작하며 최대 99개의 캡처된 하위 표현식을 저장할 수 있습니다. 각 버퍼는 'n'을 사용하여 액세스할 수 있습니다. 여기서 n은 특정 버퍼를 식별하는 한 자리 또는 두 자리 십진수입니다.
비캡처 메타 문자 '?:', '?=' 또는 '?!'를 사용하여 캡처를 재정의하고 관련 일치 항목 저장을 무시할 수 있습니다.
역참조의 가장 간단하고 유용한 응용 중 하나는 텍스트에서 인접한 두 개의 동일한 단어의 일치 항목을 찾는 기능입니다. 다음 문장을 예로 들어보세요.
Is is the cost of of gasoline going up up?
위 문장에는 분명히 여러 개의 반복 단어가 있습니다. 각 단어의 반복을 찾을 필요 없이 이 문장을 찾을 수 있는 방법을 고안하는 것이 좋을 것입니다. 다음 정규식은 이를 달성하기 위해 단일 하위 표현식을 사용합니다.
/\b([a-z]+) \b/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에 정규 표현식을 적용하면 각 하위 일치에는 다음이 포함됩니다.
첫 번째 괄호로 묶인 하위 표현식에는 "http"가 포함됩니다
두 번째 괄호로 묶인 하위 표현식에는 "www .w3cschool.cc"가 포함됩니다
The 세 번째 대괄호 하위 표현식에는 ":80"
네 번째 대괄호 하위 표현식에는 "../html/html-tutorial.html"