정규 표현식
여기에서는 정규 표현식의 정의 및 정규 표현식을 사용하여 텍스트를 검색하는 방법을 설명합니다. 정규 표현식은 유연하고 강력하지만 복잡한 구문을 사용합니다. 정규 표현식의 대안은 pattern
(R2020b 이상)으로, 더 간단하게 정의하고 작성된 코드를 더 쉽게 읽을 수 있습니다. 자세한 내용은 패턴 표현식 작성하기 항목을 참조하십시오.
정규 표현식이란?
정규 표현식은 특정 패턴을 정의하는 일련의 문자입니다. 정규 표현식은 일반적으로 프로그램 입력값을 구문 분석하거나 텍스트 블록을 처리하는 등의 작업을 수행할 때 텍스트에서 패턴과 일치하는 단어 그룹을 검색하는 데 사용합니다.
문자형 벡터 'Joh?n\w*'
은 정규 표현식의 한 예입니니다. 이 문자열은 문자 Jo
로 시작하고, 그 다음에 선택적으로 문자 h
('h?'
로 표시)가 온 다음, 문자 n
이 오고, 마지막으로 임의 개수의 단어 문자, 즉 영문자, 숫자, 밑줄 문자 중 하나('\w*'
로 표시)로 끝나는 패턴을 정의합니다. 이 패턴은 다음 모두와 일치합니다.
Jon, John, Jonathan, Johnny
정규 표현식은 많은 양의 텍스트에서 텍스트 내의 특정 문자 서브셋을 검색할 수 있는 고유한 방법을 제공합니다. strfind
와 같은 함수를 사용하여 정확히 일치하는 문자를 찾는 대신, 정규 표현식을 사용하면 특정 문자 패턴을 찾을 수 있습니다.
예를 들어, 미터법에 따라 속도를 표현하는 방법은 여러 가지가 있습니다.
km/h km/hr km/hour kilometers/hour kilometers per hour
검색 명령을 다섯 번 개별로 실행하여 텍스트에서 위의 용어를 찾을 수 있습니다.
strfind(text, 'km/h'); strfind(text, 'km/hour'); % etc.
그러나, 효율성을 높이기 위해 이러한 검색어 전체에 적용되는 하나의 구를 만들 수 있습니다.
이 구를 정규 표현식으로 변환하면(이 섹션 뒷부분에서 설명) 다음과 같이 됩니다.
pattern = 'k(ilo)?m(eters)?(/|\sper\s)h(r|our)?';
이제, 단일 명령을 사용하여 하나 이상의 용어를 찾을 수 있습니다.
text = ['The high-speed train traveled at 250 ', ... 'kilometers per hour alongside the automobile ', ... 'travelling at 120 km/h.']; regexp(text, pattern, 'match')
ans = 1×2 cell array {'kilometers per hour'} {'km/h'}
정규 표현식을 사용하여 문자 검색 및 바꾸기를 지원하는 MATLAB® 함수는 네 가지가 있습니다. 처음 세 개는 받는 입력값과 반환하는 출력값이 유사합니다. 자세한 내용을 보려면 함수 도움말 페이지 링크를 클릭하십시오.
함수 | 설명 |
---|---|
regexp | 정규 표현식과 일치시킵니다. |
regexpi | 대/소문자를 구분하지 않고 정규 표현식과 일치시킵니다. |
regexprep | 정규 표현식을 사용하여 텍스트의 일부를 바꿉니다. |
regexptranslate | 텍스트를 정규 표현식으로 변환합니다. |
처음 세 개의 함수 중 하나를 호출할 경우 구문 분석되는 텍스트와 정규 표현식을 처음 두 개의 입력 인수로 전달해야 합니다. regexprep
를 호출할 경우에는 대체 텍스트에 대한 패턴을 지정하는 표현식인 추가 입력값을 전달해야 합니다.
표현식 작성 단계
다음 세 단계에 따라 정규 표현식을 사용하여 텍스트에서 특정 용어를 검색할 수 있습니다.
이 작업에는 검색하려는 텍스트를 동종 문자 유형의 그룹으로 분리하는 작업이 수반됩니다. 이러한 문자 유형은 일련의 소문자와 하나의 달러 기호 다음에 세 개의 숫자와 소수점 등으로 구성될 수 있습니다.
이 문서에서 설명하는 메타문자(Metacharater)와 연산자를 사용하여 검색 패턴의 개별 세그먼트를 정규 표현식으로 표현합니다. 그런 다음, 이러한 표현식 세그먼트를 검색에 사용할 단일 표현식으로 결합합니다.
구문 분석할 텍스트를
regexp
또는regexpi
와 같은 검색 함수 중 하나로 전달하거나 텍스트 대체 함수regexprep
로 전달합니다.
이 섹션에 나와 있는 예제에서는 5명의 친구로 구성된 그룹의 연락처 정보를 포함하는 레코드를 검색합니다. 이 정보에는 각 사람의 이름, 전화 번호, 거주지 및 이메일 주소가 포함됩니다. 텍스트에서 특정 정보를 추출하는 것이 목적입니다.
contacts = { ... 'Harry 287-625-7315 Columbus, OH hparker@hmail.com'; ... 'Janice 529-882-1759 Fresno, CA jan_stephens@horizon.net'; ... 'Mike 793-136-0975 Richmond, VA sue_and_mike@hmail.net'; ... 'Nadine 648-427-9947 Tampa, FL nadine_berry@horizon.net'; ... 'Jason 697-336-7728 Montrose, CO jason_blake@mymail.com'};
이 예제의 첫 부분에서는 표준 이메일 주소의 형식을 나타내는 정규 표현식을 작성합니다. 그런 다음, 작성된 표현식을 사용하여 친구 그룹에서 특정 친구의 이메일 주소를 검색합니다. Janice의 연락처 정보는 contacts
셀형 배열의 2행에 있습니다.
contacts{2}
ans = 'Janice 529-882-1759 Fresno, CA jan_stephens@horizon.net'
1단계 — 텍스트에서 고유 패턴 식별
일반적인 이메일 주소는 표준 구성요소, 즉 사용자 계정 이름과 @ 기호, 사용자의 ISP(인터넷 서비스 공급자) 이름, 점(마침표), ISP가 속하는 도메인으로 구성됩니다. 아래 표의 왼쪽 열에는 이러한 구성요소가 나와 있으며, 오른쪽 열에는 각 구성요소의 일반적인 형식이 나와 있습니다.
고유한 이메일 주소 패턴 | 각 패턴에 대한 일반적인 설명 |
---|---|
계정 이름으로 시작합니다.jan_stephens . . . | 하나 이상의 소문자 및 밑줄 |
'@ '을 추가합니다.jan_stephens@ . . . | @ 기호 |
ISP를 추가합니다. jan_stephens@horizon . . . | 하나 이상의 소문자, 밑줄 없음 |
점(마침표)을 추가합니다.jan_stephens@horizon. . . . | 점(마침표) 문자 |
도메인으로 끝납니다.jan_stephens@horizon.net | com 또는 net |
2단계 — 정규 표현식으로 개별 패턴 표현
이 단계에서는 1단계에서 도출한 일반 형식을 정규 표현식의 세그먼트로 변환합니다. 그런 다음, 세그먼트들을 함께 합쳐 전체 표현식을 구성합니다.
아래 표의 왼쪽 열에는 개별 문자 패턴에 대해 일반화된 형식 설명이 나와 있습니다. (이 열의 내용은 1단계에 있는 표의 오른쪽 열에서 가져온 것입니다.) 두 번째 열에는 문자 패턴을 나타내는 연산자나 메타문자가 나와 있습니다.
각 세그먼트의 설명 | 패턴 |
---|---|
하나 이상의 소문자 및 밑줄 | [a-z_]+ |
@ 기호 | @ |
하나 이상의 소문자, 밑줄 없음 | [a-z]+ |
점(마침표) 문자 | \. |
com 또는 net | (com|net) |
이러한 패턴을 하나의 문자형 벡터로 조합하면 완전한 표현식이 완성됩니다.
email = '[a-z_]+@[a-z]+\.(com|net)';
3단계 — 적합한 검색 함수 호출
이 단계에서는 2단계에서 도출한 정규 표현식을 사용하여 그룹에 속하는 특정 친구의 이메일 주소와 일치시킵니다. regexp
함수를 사용하여 검색을 수행합니다.
다음은 이 섹션의 앞부분에 나와 있는 연락처 정보 목록입니다. 각 개인의 레코드는 contacts
셀형 배열의 한 행을 차지합니다.
contacts = { ... 'Harry 287-625-7315 Columbus, OH hparker@hmail.com'; ... 'Janice 529-882-1759 Fresno, CA jan_stephens@horizon.net'; ... 'Mike 793-136-0975 Richmond, VA sue_and_mike@hmail.net'; ... 'Nadine 648-427-9947 Tampa, FL nadine_berry@horizon.net'; ... 'Jason 697-336-7728 Montrose, CO jason_blake@mymail.com'};
다음은 2단계에서 도출된 대로 이메일 주소를 나타내는 정규 표현식입니다.
email = '[a-z_]+@[a-z]+\.(com|net)';
contacts
셀형 배열의 2행과 email
정규 표현식을 전달하여 regexp
함수를 호출합니다. 그러면 Janice의 이메일 주소가 반환됩니다.
regexp(contacts{2}, email, 'match')
ans = 1×1 cell array {'jan_stephens@horizon.net'}
MATLAB은 마치 벡터를 "소비"하듯이 왼쪽에서 오른쪽으로 문자형 벡터를 구문 분석하며 진행합니다. 일치하는 문자가 발견될 경우 regexp
는 그 위치를 기록한 후, 가장 최근에 일치했던 위치 바로 다음부터 문자형 벡터 구문 분석 작업을 재개합니다.
이번에는 목록의 다섯 번째 사람에 대해 동일한 호출을 수행합니다.
regexp(contacts{5}, email, 'match')
ans = 1×1 cell array {'jason_blake@mymail.com'}
입력 인수로 제공된 셀형 배열 전체에서 목록에 있는 모든 사람의 이메일 주소를 검색할 수도 있습니다.
regexp(contacts, email, 'match');
연산자와 문자
정규 표현식은 다음 섹션에 설명된 대로 일치시킬 패턴을 지정하는 문자, 메타문자, 연산자, 토큰 및 플래그를 포함할 수 있습니다.
메타문자
메타문자는 문자, 문자 범위, 숫자 및 공백 문자를 나타냅니다. 메타문자를 사용하여 일반화된 문자 패턴을 생성할 수 있습니다.
메타문자 | 설명 | 예 |
---|---|---|
| 임의의 단일 문자입니다(공백 포함). |
|
| 대괄호 내에 포함된 임의의 문자입니다. |
|
| 대괄호 내에 포함되지 않은 임의의 문자입니다. |
|
|
|
|
| 임의의 영문자, 숫자, 밑줄 문자 중 하나입니다. 영어 문자 집합의 경우 |
|
| 영문자, 숫자, 밑줄이 아닌 임의의 문자입니다. 영어 문자 집합의 경우 |
|
| 임의의 공백 문자로 |
|
| 공백이 아닌 임의의 문자로 |
|
| 임의의 숫자로 |
|
| 숫자가 아닌 임의의 문자로 |
|
| 8진수 값 |
|
| 16진수 값 |
|
문자 표현
연산자 | 설명 |
---|---|
| 경보(경고음) |
| 백스페이스 |
| 폼 피드(FF) |
| 새 줄(Newline) |
| 캐리지 리턴 |
| 가로 탭 |
| 세로 탭 |
| 정규 표현식에서 문자 그대로 일치시키려는 특수 의미를 갖는 임의의 문자(예를 들어, |
수량자
수량자는 패턴이 일치하는 텍스트에서 나타나야 하는 패턴의 횟수를 지정합니다.
수량자 | 표현식이 나타나는 횟수 | 예 |
---|---|---|
| 연속 0회 이상입니다. |
|
| 0회 또는 1회입니다. |
|
| 연속 1회 이상입니다. |
|
| 연속
|
|
| 연속
|
|
| 정확하게 연속
|
|
수량자는 다음 표에 설명되어 있는 세 가지 모드로 나타날 수 있습니다. q는 이전 표에 나와 있는 수량자 중 하나를 나타냅니다.
모드 | 설명 | 예 |
---|---|---|
| 최대 일치 표현식(Greedy Expression): 가능한 한 많은 문자와 일치시킵니다. | 텍스트
|
| 최소 일치 표현식(Lazy Expression): 필요한 최소한의 문자와 일치시킵니다. | 텍스트
|
| 독점적 일치 표현식(Possessive Expression): 가능한 한 많이 일치시킵니다. 단, 텍스트의 일부를 다시 돌아가서 검색하지는 않습니다. | 텍스트 |
그룹화 연산자
그룹화 연산자를 사용하면 토큰을 캡처하거나, 하나의 연산자를 여러 요소에 적용하거나, 특정 그룹의 역추적을 비활성화할 수 있습니다.
그룹화 연산자 | 설명 | 예 |
---|---|---|
| 표현식의 요소를 그룹화하고 토큰을 캡처합니다. |
|
| 그룹화를 수행하지만 토큰을 캡처하지는 않습니다. |
그룹화를 사용하지 않을 경우, |
| 아토믹 단위로 그룹화합니다. 일치 작업을 완료하기 위해 그룹 내에서 역추적을 수행하지 않으며 토큰을 캡처하지 않습니다. |
|
| 표현식
여는 괄호 다음에 |
|
앵커(Anchor)
표현식에 포함된 앵커는 문자형 벡터나 단어의 시작 또는 끝부분과 일치시킵니다.
앵커(Anchor) | 일치 항목 | 예 |
---|---|---|
| 입력 텍스트의 시작 부분입니다. |
|
| 입력 텍스트의 끝부분입니다. |
|
| 단어의 시작 부분입니다. |
|
| 단어의 끝부분입니다. |
|
전후방 탐색 어설션(Lookaround Assertion)
전후방 탐색 어설션(Lookaround Assertion)은 찾으려는 일치 항목 바로 앞이나 뒤에 오는 패턴을 검색합니다. 검색 결과에 자신은 포함시키지 않습니다.
포인터는 현재 위치에 그대로 유지되며 test
표현식에 대응하는 문자는 캡처되거나 삭제되지 않습니다. 따라서, 전방 탐색 어설션은 겹치는 문자 그룹과 일치할 수 있습니다.
전후방 탐색 어설션 | 설명 | 예 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
표현식 앞에 전방 탐색 어설션(Lookahead Assertion)을 지정하는 경우 이 연산은 논리 AND
와 일치합니다.
작업 | 설명 | 예 |
---|---|---|
|
|
|
|
|
|
자세한 내용은 정규 표현식의 전방 탐색 어설션(Lookahead Assertion) 항목을 참조하십시오.
논리 연산자 및 조건 연산자
논리 연산자와 조건 연산자를 사용하여 특정 조건의 상태를 테스트한 후, 해당하는 경우 다음에 일치시킬 패턴을 확인하는 데 그 결과를 사용할 수 있습니다. 이러한 연산자는 논리 OR
및 if
또는 if/else
조건을 지원합니다. (AND
조건은 전후방 탐색 어설션(Lookaround Assertion) 항목을 참조하십시오.)
조건은 토큰, 전후방 탐색 어설션(Lookaround Assertion), (?@cmd)
형식의 동적 표현식 중 하나일 수 있습니다. 동적 표현식은 논리값이나 숫자형 값을 반환해야 합니다.
조건 연산자 | 설명 | 예 |
---|---|---|
| 표현식
|
|
| 조건 |
|
| 조건 |
|
토큰 연산자
토큰은 정규 표현식의 일부를 괄호로 묶어 정의하며 일치하는 텍스트의 일부분입니다. 텍스트에 포함된 순서대로 토큰(순서형 토큰)을 참조하거나 더욱 용이하게 코드를 유지 관리하고 읽기 편한 출력값을 생성하도록 토큰에 이름을 할당할 수 있습니다.
순서형 토큰 연산자 | 설명 | 예 |
---|---|---|
| 토큰에서 괄호 안의 표현식과 일치하는 문자를 캡처합니다. |
|
|
|
|
|
|
|
명명된 토큰 연산자 | 설명 | 예 |
---|---|---|
| 명명된 토큰에서 괄호 안의 표현식과 일치하는 문자를 캡처합니다. |
|
|
|
|
| 명명된 토큰이 검색되는 경우 |
|
참고
표현식에 중첩 괄호가 있는 경우, MATLAB은 가장 바깥쪽에 있는 괄호 세트에 대응하는 토큰을 캡처합니다. 예를 들어, 검색 패턴 '(and(y|rew))'
가 주어진 경우 MATLAB은 'y'
또는 'rew'
에 대한 토큰이 아니라 'andrew'
에 대한 토큰을 생성합니다.
자세한 내용은 정규 표현식의 토큰 항목을 참조하십시오.
동적 표현식
동적 표현식을 사용하면 MATLAB 명령 또는 정규 표현식을 실행하여 일치하는 텍스트를 확인할 수 있습니다.
동적 표현식을 묶는 괄호는 캡처 그룹을 생성하지 않습니다.
연산자 | 설명 | 예 |
---|---|---|
|
구문 분석 시, |
|
|
|
|
|
|
|
동적 표현식 내에 다음 연산자를 사용하여 대체어를 정의합니다.
대체 연산자 | 설명 |
---|---|
| 입력 텍스트에서 현재 일치 항목인 부분 |
| 입력 텍스트에서 현재 일치 항목 앞에 오는 부분 |
| 입력 텍스트에서 현재 일치 항목 다음에 오는 부분( |
|
|
| 명명된 토큰 |
| MATLAB이 명령 |
자세한 내용은 동적 정규 표현식 항목을 참조하십시오.
설명
comment
연산자를 사용하면 유지 관리하기 쉽도록 코드에 주석을 삽입할 수 있습니다. 입력 텍스트와 일치시킬 때 주석 텍스트는 MATLAB에 의해 무시됩니다.
문자 | 설명 | 예 |
---|---|---|
(?#comment) | 정규 표현식에 주석을 삽입합니다. 입력값과 일치시킬 때 주석 텍스트는 무시됩니다. |
|
검색 플래그
검색 플래그는 일치시키는 표현식의 동작을 수정합니다.
플래그(flag) | 설명 |
---|---|
(?-i) | 문자의 대/소문자를 일치시킵니다( |
(?i) | 문자의 대/소문자를 일치시키지 않습니다( |
(?s) | 임의의 문자를 포함하는 패턴에서 점( |
(?-s) | 새 줄(Newline) 문자가 아닌 임의의 문자를 포함하는 패턴에서 점을 일치시킵니다. |
(?-m) | 텍스트의 시작 부분 및 끝부분에서 |
(?m) | 라인의 시작 부분과 끝부분에서 |
(?-x) | 일치 작업을 수행할 때 공백 문자와 주석을 포함시킵니다(디폴트 값). |
(?x) | 일치 작업을 수행할 때 공백 문자와 주석을 무시합니다. 공백 문자 및 |
플래그가 수정하는 표현식은 다음과 같이 괄호 다음에 나타나거나
(?i)\w*
다음과 같이 괄호 안에서 플래그가 콜론(:
)으로 구분된 형태로 나타날 수 있습니다.
(?i:\w*)
두 번째 구문을 사용하면 더 큰 표현식의 일부분에 대한 동작을 변경할 수 있습니다.
참고 항목
regexp
| regexpi
| regexprep
| regexptranslate
| pattern