정규표현식 연습 - regexone.com
Lesson
Lesson 1: An Introduction, and the ABCs
정규식은 코드, 로그 파일, 스프레드 시트 또는 문서와 같은 텍스트에서 정보를 추출하는데 매우 유용합니다. 공식 언어에는 많은 이론이 있지만 다음 강의와 예제에서는 정규 표현식을 보다 실용적인 방식으로 사용하여 가능한 한 빨리 사용할 수 있도록 합니다.
정규 표현식을 사용할 때 가장 먼저 알아야 할 것은 모든 것이 본질적으로 문자이며 우리는 특정 문자 시퀀스 (문자열이라고도 함)와 일치하는 패턴을 작성하고 있습니다. 대부분의 패턴은 문자, 숫자, 구두점 및 기타 기호를 % # $ @ !
와 같이 키보드에 포함하는 일반 ASCII를 사용하지만 유니 코드 문자는 모든 유형의 국제 텍스트와 일치시키는 데에도 사용할 수 있습니다.
다음은 몇 줄의 텍스트입니다. 아래 입력 필드에 입력 할 때 각 줄의 일치하는 문자를 강조 표시하기 위해 텍스트가 어떻게 변경되는지 확인하십시오. 다음 단원을 계속 진행하려면 각 단원에 소개 된 새로운 구문과 개념을 사용하여 제공되는 모든 줄과 일치하는 패턴을 작성해야 합니다.
3행 모두와 일치하는 패턴을 작성해보십시오. 각 행의 일반 문자만큼 간단 할 수 있습니다.
1 | abc |
Lesson 1½: The 123s
문자에는 일반 문자가 포함되지만 숫자도 포함됩니다. 실제로 숫자 0-9는 문자이기도하며 ASCII
테이블을 보면 순차적으로 나열됩니다.
다양한 레슨을 통해 정규 표현식에 사용되는 특정 유형의 문자를 일치시키는 데 사용할 수있는 여러 가지 특수 메타 문자가 소개됩니다. 이 경우 문자 \d
는 0에서 9 사이의 임의의 숫자 대신 사용할 수 있습니다. 앞의 슬래시는 간단한 d 문자와 구별되며 문자가 메타 문자
임을 나타냅니다.
다음은 숫자가 포함 된 몇 줄의 텍스트입니다. 아래 문자열의 모든 숫자와 일치하는 패턴을 작성하고 첫 번째 문자에서 시작하는 것뿐만 아니라 문자열 내 어디에서나 패턴이 일치하는지 확인하십시오. 우리는 이후 학습에서 이것을 어떻게 제어하는지 배울 것입니다.
1 | \d |
Lesson 2: The Dot
일부 카드 게임에서 조커는 와일드 카드이며 갑판의 모든 카드를 나타낼 수 있습니다. 정규식을 사용하면 공통된 패턴이나 구조 (예 : 전화 번호 또는 우편 번호)를 공유하는 것 이외에 정확한 내용을 모르는 텍스트 조각과 일치하는 경우가 많습니다.
마찬가지로 와일드 카드
라는 개념이 있는데 이는 와일드 카드로 표현됩니다. (점) 메타 문자를 사용하고 단일 문자 (문자, 숫자, 공백, 모든 것)와 일치시킬 수 있습니다. 이것은 실제로 마침표 문자의 일치를 무시하므로 마침표와 특별히 일치 시키려면 점을 슬래시 \
로 이스케이프 처리해야합니다.
아래에는 다양한 문자가 있지만 길이가 같은 몇 개의 문자열이 있습니다. 처음 세 문자열은 일치 할 수 있지만 마지막은 건너 뛸 수 없는 단일 패턴을 작성하십시오. 일부 줄의 마침표와 일치하도록 점 메타 문자를 이스케이프 처리해야 할 수도 있습니다.
1 | .+\. |
Lesson 3: Matching specific characters
마지막 레슨의 점 메타 문자는 매우 강력하지만 때로는 너무 강력합니다. 예를 들어 전화 번호와 일치하는 경우 "(abc) def-ghij"문자를 유효한 숫자로 확인하고 싶지 않습니다!
정규 표현식을 사용하여 특정 문자를 대괄호 안에 정의하여 일치시키는 방법이 있습니다. 예를 들어 [abc]
패턴은 단일 a, b 또는 c 문자와 만 일치하고 다른 문자는 일치하지 않습니다.
다음은 처음 세 개의 문자열만 일치시키고 마지막 세 개의 문자열은 일치시키지 않는 몇 줄입니다. .
를 사용하는 경우 마지막 세 문자열의 일치를 피할 수는 없지만 위의 표기법을 사용하여 일치시킬 문자를 구체적으로 정의해야합니다.
1 | [cmf]an |
Lesson 4: Excluding specific characters
경우에 따라 일치하지 않는 특정 문자가 있음을 알 수 있습니다. 예를 들어, 지역번호가 650이 아닌 전화 번호만 일치시킬 수 있습니다.
이를 나타 내기 위해 대괄호와 ^(hat)
를 사용하여 특정 문자를 제외하는 표현식을 사용합니다. 예를 들어 [^abc] 패턴은 문자 a, b 또는 c를 제외한 모든 단일 문자와 일치합니다.
아래 문자열을 사용하여 살아있는 동물(hog, dog, but not bog)만 일치시키는 패턴을 작성하십시오. 이 유형의 대부분의 패턴이 동일한 동전의 실제 양면이기 때문에 마지막 수업의 기법을 사용하여 작성 될 수 있습니다. 두 가지 선택을 가짐으로써 자신의 패턴을 작성할 때 작성하고 이해하기 쉬운 것을 결정할 수 있습니다.
1 | [^b]og |
Lesson 5: Character ranges
우리는 방금 특정 문자와 일치하거나 제외하는 패턴을 만드는 방법을 배웠습니다. 그러나 연속 범위 문자가 될 수있는 문자를 일치 시키려면 어떻게해야합니까? 우리 모두를 나열 할 수 밖에 없을까요?
다행히도 대괄호 표기법을 사용하는 경우 대시
를 사용하여 문자 범위를 나타내는 순차 문자 목록에서 문자를 일치시킬 수 있습니다. 예를 들어, 패턴 [0-6]
은 0에서 6까지의 임의의 한 자리 문자에만 일치하며 그 밖의 것은 일치하지 않습니다. 마찬가지로 [^n-p]
는 n에서 p까지의 문자를 제외하고는 하나의 문자만 일치시킵니다.
여러 문자 범위는 개별 문자와 함께 동일한 대괄호 세트에서 사용될 수 있습니다. 예를 들어 문자 범위 [A-Za-z0-9_]와 동등한 \w
메타 문자가 있으며 영어 텍스트의 문자를 일치시키는 데 자주 사용됩니다.
아래 연습에서는 모든 일치 및 건너뛰기 패턴을 확인하고 괄호 표기법을 사용하여 각 줄의 각 문자를 일치 시키거나 건너 뜁니다.
패턴은 대소문자를 구분하며 a-z는 A-Z와 문자가 다르다는 점에 유의하십시오 (대문자 vs 소문자).
1 | ;[A - Z] |
Lesson 6: Catching some zzz’s
참고 : 아래의 반복 구문 중 일부는 모든 정규 표현식 구현에서 지원되지 않습니다.
우리는 지금까지 일치시키고 자하는 문자의 범위를 지정하는 방법을 배웠습니다. 그러나 일치시키고자 하는 문자의 반복 횟수는 어떻게 할까요? 우리가 할 수있는 한 가지 방법은 명시적으로 얼마나 많은 문자가 필요한지 정확하게 명시하는 것입니다. \d\d\d
는 정확히 3 자리와 일치합니다.
보다 편리한 방법은 중괄호 표기법을 사용하여 원하는 각 문자의 반복 횟수를 지정하는 것입니다. 예를 들어, {3}
은 한 문자를 정확히 3 번 일치시킵니다. 특정 정규식 엔진은 이 반복에 대한 범위를 지정하여 {1,3}
이 한 문자이상이며 3회 이하만 일치하도록 허용합니다.
이 한정 기호는 임의의 문자 또는 특수 메타 문자와 함께 사용할 수 있습니다. 예를 들어 w{3}
(3 개의 w), [wxy]{5}
(5 개의 문자 각각 w, x 또는 y가 될 수 있음) 및 .{2,6}
(임의의 문자 2-6 사이)
아래의 줄에서 하나의 z만있는 마지막 문자열은 "wazzup"이라는 속어의 철자가 올바른지 생각하지 않습니다. 위의 중괄호 표기법을 사용하여 처음 두 개의 철자와 일치하는 패턴을 작성하십시오.
1 | z{2,5} |
Lesson 7: Mr. Kleene, Mr. Kleene
정규 표현식의 강력한 개념은 임의의 수의 문자를 일치시키는 기능입니다. 예를 들어 달러로 숫자 값을 입력하는 기부 필드가 있는 양식을 작성했다고 가정 해보십시오. 부유한 사용자는 2만 5천 달러를 기부하고 일반 사용자는 25 달러를 기부 할 수 있습니다.
그러한 패턴을 표현하는 한 가지 방법은 Kleene Star와 Kleene Plus로 알려진 것을 사용하는 것입니다. Kleene Plus는 본질적으로 0 또는 1 또는 그 이상의 문자를 나타냅니다 (항상 문자 또는 그룹을 따릅니다). 예를 들어, 위의 기부금을 일치 시키려면 \d*
패턴을 사용하여 임의의 자릿수를 일치시킬 수 있지만 더 엄격한 정규 표현식은 \d+
가되어 입력 문자열에 적어도 하나의 숫자가 있어야합니다.
이러한 한정 기호는 임의의 문자 또는 특수 메타 문자 (예 : a+ (하나 이상의 a)), [abc]+ (a, b 또는 c 문자 중 하나 이상) 및 .*
(0 개 이상의 문자 ).
다음은 별표와 더하기 메타 문자를 사용하여 일치시킬 수있는 간단한 문자열입니다.
1 | aa.+ |
Lesson 8: Characters optional
이전 강의에서 보았 듯이, Kleene 별(*)과 플러스(+)는 반복 된 문자를 한 줄에 일치시킬 수 있게합니다.
텍스트를 매칭하고 추출 할 때 정말로 일반적으로 사용되는 다른 한정 기호는 ?(물음표)
메타 문자입니다. 이 메타 문자를 사용하면 앞의 문자 또는 그룹 중 0 또는 하나
를 일치시킬 수 있습니다. 예를 들어, 패턴 ab?c
는 b가 선택적으로 간주되기 때문에 "abc"또는 "ac"문자열과 일치합니다.
점 메타 문자와 마찬가지로 물음표는 특수 문자이므로 슬래시를 사용하여 이스케이프 처리해야합니다. 문자열의 일반 물음표 문자와 일치시킵니다.
아래 문자열에서 단어 "파일"의 복수가 발견 된 파일의 수에 따라 어떻게 달라지는 지주의하십시오. 옵션 메타 문자를 사용하는 패턴을 작성하여 하나 이상의 파일이있는 행만 일치 시키십시오.
1 | \? |
Lesson 9: All this whitespace
로그 파일 및 사용자 입력과 같은 실제 입력을 처리 할 때 공백이 발생합니다. 시각적으로 읽기 및 스캔을 쉽게하기 위해 정보의 형식을 지정하는 데 이 정보를 사용하고 단일 공간으로 렌치를 간단한 정규 표현식에 넣을 수 있습니다.
정규 표현식과 함께 사용할 공백의 가장 일반적인 형태는 공백(␣), 탭(\t), 줄 바꾸기(\n) 및 캐리지 리턴(\r) (Windows 환경에서 유용함)이며 특수 문자는 각 공백과 일치합니다. 또한 공백 특수 문자 \s
는 위의 특정 공백과 일치하며 원시 입력 텍스트를 처리 할 때 매우 유용합니다.
아래 문자열에서 각 줄의 내용은 줄의 색인에서 공백으로 약간 들여 쓰는 것을 볼 수 있습니다 (숫자는 일치시킬 텍스트의 일부 입니다). 숫자와 내용 사이의 공백 정도에 관계없이 각 줄을 일치시킬 수 있는 패턴을 작성하십시오. 공백 문자는 다른 문자와 같으며 별과 플러스 같은 특수 메타 문자도 사용할 수 있습니다.
1 | \d\.\s+\w+ |
Lesson 10: Starting and ending
지금까지는 모든 텍스트에서 부분적으로 일치하는 정규식을 작성했습니다. 때로는 바람직하지 않습니다. 예를 들어 로그 파일에서 "success"라는 단어를 일치 시키려고 했습니다. 확실히 그 패턴이 "Error : failed operation"이라는 줄과 일치하는 것을 원하지 않습니다! 따라서 실제 텍스트와 비교할 때 오탐지 (false positives)가 발생하지 않도록 가능한 한 특정 정규 표현식으로 작성하는 것이 가장 좋습니다.
패턴을 강화하는 한 가지 방법은 특수 ^
(모자) 및 $
(달러 기호) 메타 문자를 사용하여 행의 시작과 끝을 모두 설명하는 패턴을 정의하는 것입니다. 위 예제에서 패턴 "successful"을 사용하여 단어 "successful"으로 시작하는 행만 일치시킬 수 있지만 "오류 : 실패한 조작"행은 일치시키지 않습니다. 모자와 달러 기호를 결합하면 시작과 끝 부분에서 전체 선과 완전히 일치하는 패턴을 만들 수 있습니다.
이것은 정규 표현식을 읽을 때 혼동을 줄 수있는 문자를 제외하기 위해 [^…] 괄호 안에 사용 된 모자와는 다릅니다.
이 새로운 특수 문자를 사용하여 아래의 각 문자열을 일치 시키십시오.
1 | \ssuccessful$ |
Lesson 11: Match groups
정규 표현식을 사용하면 텍스트를 일치시킬 뿐만 아니라 추가 처리를 위해 정보를 추출 할 수 있습니다. 이것은 문자 그룹을 정의하고 특수 괄호 및 메타 문자를 사용하여 문자 그룹을 캡처하여 수행됩니다. 괄호 안에 있는 하위 패턴은 그룹으로 캡처됩니다. 실제로 이것은 모든 종류의 데이터에서 전화번호나 전자 메일과 같은 정보를 추출하는 데 사용할 수 있습니다.
예를 들어 클라우드에있는 모든 이미지 파일을 나열하는 명령 줄 도구가 있다고 상상해보십시오. 그런 다음 ^(IMG\d+\.png)$
와 같은 패턴을 사용하여 전체 파일 이름을 캡처하고 추출 할 수 있지만 확장자없이 파일 이름 만 캡처하려는 경우 ^(IMG\d+)
패턴을 사용할 수 있습니다. \.png$
는 기간 이전에 부분 만 캡처합니다.
앞으로이 파일을 사용하여 아래 PDF 파일의 파일 이름 (확장명 제외)과 일치하는 정규 표현식을 작성하십시오.
1 | (\w+).pdf$ |
Lesson 12: Nested groups
복잡한 데이터로 작업 할 때 여러 계층의 정보를 추출해야하는 것을 쉽게 발견 할 수 있으므로 중첩 된 그룹이 될 수 있습니다. 일반적으로 캡처 된 그룹의 결과는 정의 된 순서대로 나타납니다 (순서대로 괄호로 묶음).
이전 수업에서 보여준 예제를 사용하면 목록에있는 모든 이미지 파일의 파일 이름을 캡처 할 수 있습니다. 이러한 이미지 파일 각각에 파일 이름에 순차적 인 그림 번호가있는 경우 동일한 패턴을 사용하여 ^(IMG(\d+))\.png$
와 같은 표현식을 작성하여 파일 이름과 그림 번호를 모두 추출 할 수 있습니다 (중첩 자리를 캡처하는 괄호).
중첩 된 그룹은 패턴에서 왼쪽에서 오른쪽으로 읽히고 첫 번째 캡처 그룹은 첫 번째 괄호 그룹의 내용이 됩니다.
다음 문자열의 경우 날짜의 전체 날짜와 연도를 일치시키고 캡처하는 식을 작성하십시오.
1 | ((\w+) (\d+)) |
Lesson 13: More group work
이전 수업에서 보았듯이 별 *
, 더하기 +
, 반복 {m, n}
을 비롯한 모든 수량 기호와 물음표가 모두 캡처 그룹 패턴 내에서 사용할 수 있습니다. 이 방법은 개별 문자 자체 대신 문자 시퀀스에 수량 기호를 적용하는 유일한 방법입니다.
예를 들어 전화 번호에 지역 번호가 포함되어 있거나 없을 수도 있다는 것을 알고 있다면 올바른 패턴은 전체 숫자 그룹 (\d{3})
의 존재 여부를 테스트합니다. 개별 문자 자체가 아닙니다 (잘못된 것입니다).
사용중인 정규 표현식 엔진에 따라 그룹을 일치시킬 수도 있지만 결과에 나타나지 않는 비 캡처 그룹을 사용할 수도 있습니다.
다음은 몇 가지 일반적인 디스플레이 해상도입니다. 각 디스플레이의 너비와 높이를 캡처하십시오.
1 | (\d{4})x(\d{3,4}) |
Lesson 14: It’s all conditional
앞에서 언급했듯이 코딩은 항상 정확해야하며 코딩, 말하기, 정규 표현식에도 적용됩니다. 예를 들어, 다른 사람이 더 많은 것을 사기위한 식료품 목록을 작성하지 않을 것입니다. 대신에 더 많은 우유를 사거나 빵을 더 사야한다고 쓰면 정규 표현식에서 이러한 조건부를 명시 적으로 정의 할 수 있습니다.
특히 그룹을 사용할 때 |
(논리적 OR, 일명 파이프) 다른 가능한 문자 집합을 나타냅니다. 위의 예에서, 문자열만 일치시키기 위해 "Buy more (milk|bread|juice)"패턴을 작성하여 더 많은 우유를 사거나, 빵을 더 구입하거나, 더 많은 주스를 구입할 수 있습니다.
일반 그룹과 마찬가지로 조건에서 문자 또는 메타 문자 시퀀스를 사용할 수 있습니다. 예를 들어 ([cb]ats*|[dh]ogs?)는 고양이 또는 박쥐 또는 개 또는 돼지와 일치합니다. 많은 조건을 가진 패턴을 쓰는 것은 읽기가 어려울 수 있으므로 너무 복잡한 경우 패턴을 개별적으로 만드는 것을 고려해야합니다.
아래의 작은 생물이 있는 라인만 일치시키는 조건부 패턴을 작성해보십시오.
1 | (cats|dogs) |
Lesson 15: Other special characters
이 강의에서는 캡처 된 그룹의 결과 뿐만 아니라 일부 추가 메타 문자를 다룹니다.
\d
를 사용하여 숫자를 캡처하는 가장 일반적인 메타 문자 및 \w
를 사용하여 영숫자와 숫자를 배웠지만 정규 표현식은 대문자를 사용하여 각 메타 문자의 반대 세트를 지정하는 방법을 제공합니다 소문자. 예를 들어 \D
는 임의의 비 숫자 문자, \S
임의의 비 공백 문자 및 \W
영숫자가 아닌 임의의 문자 (예 : 구두점)를 나타냅니다. 정규식 작성 방법에 따라 둘 중 하나를 사용하는 것이 더 쉬울 수도 있습니다.
또한 단어와 단어가 아닌 문자의 경계를 일치시키는 특수 메타 문자 \b
가 있습니다. 전체 단어를 캡처하는 데 가장 유용합니다 (예 : \w+\b 패턴 사용).
이 레슨에서 자세히 살펴 보지 않을 개념 중 하나는 역 참조입니다. 이는 주로 구현에 따라 달라지기 때문입니다. 그러나 대부분의 시스템에서는 \0 (일반적으로 전체 일치 텍스트), \1 (그룹 1), \2 (그룹 2) 등을 사용하여 캡처 된 그룹을 참조 할 수 있습니다. 예를 들어 텍스트를 사용할 때 유용합니다. 편집기를 사용하고 검색을 수행하고 정규 표현식을 사용하여 두 개의 숫자를 바꾼다면 "(\d+) - (\d+)"를 검색하고 "\2 - \1"로 바꿀 수 있습니다.
아래에 여러 문자열이 있습니다. 다른 유형의 메타 문자나 이전 학습에서 배운 내용을 시험해보고 준비가 되면 계속하십시오.
1 | .* |