/Regular-Expression

정규표현식을 연습할 수 있는 https://regexone.com/ 사이트 내용을 번역했습니다.

Regular Expression

Created: 2020년 8월 10일 오후 1:54 Type: Lecture url: https://regexone.com/

Lesson 1: An Introduction, and The ABCs - abc... Letters

정규 표현식은 코드, 로그 파일, 스프래드시트 그리고 심지어 문서에서부터 정보를 추출할때 매우 효율적입니다. 일반적인 언어 뒤엔 많은 이론들이 있지만, 앞으로 나올 내용과 예제에서 정규 표현식의 실용적인 사용을 최대한 빠르게 익힐 수 있을것입니다.

정규표현식을 사용할때 가장 먼저 인지해야 할 점은 모든 것은 본질적으로 문자(Character) 이고, 특정한 문자의 순서에 맞는 패턴을 사용하고있다는 것입니다 (string으로 알려져있는 것들도요.). 대부분의 패턴들은 문자, 숫자, 구두점 및 %#$@! 와 같은 너의 키보드에 있는 기타 기호들을 포함하는 일반적인 ASCII를 사용하지만, 유니코드 문자는 국제적인 텍스트 형식에 맞추는데도 사용합니다.

아래에는 몇줄의 문자들이 있습니다. 너가 아래에 있는 입력창에 입력할때 각 줄에 일치하는 문자를 나타내는 하이라이트가 어떻게 변하는지 확인하세요. 다음 수업을 계속하려면, 너는 새로운 문법과 각각의 수업에서 주어진 라인들을 모두 매치하게 하는 패턴을 작성하는 개념을 사용할 줄 알아야합니다.

아래 주어진 3개의 열에 맞는 패턴을 어서 작성 해 보세요. 아마 쉬울껍니다.

Untitled


Lesson 1.5: The 123s - 123... Digits / \d Any Digit / \D Any Non-digit character

문자(Character)들은 일반적인 알파뱃을 포함합니다. 숫자 역시 그렇습니다. 사실 0~9 숫자들도 또한 그냥 문자들입니다. 만약 너가 ASCII table을 본다면 숫자들이 연속적으로 목록에 있는 것을 볼 수 있을것입니다.

다양한 수업을 통해 특정 유형의 문자(Character) 에 맞춰 사용할 수 있는 정규표현식에 사용되는 특수 메타케릭터를 다수 소개할껍니다. 이번 시간에서는, 문자 \d0~9인 어떠한 숫자가 있는 위치에 사용되어질 수 있다는 것입니다. 앞에 있는 슬래쉬는 단순한 문자 d 와 구별시켜주고 이게 메타케릭터라는것을 나타냅니다.

아래에 숫자를 포함하는 몇개의 문장이 있습니다. 아래에 있는 문자열에 있는 모든 숫자가 일치하는 패턴을 적어보는 것을 시도해보고, 너의 패턴이 단순히 첫 시작 문자가 아닌 문자열 내 어디든 일치하는 것을 주목하세요. 나중에 나올 수업에서 우린 이걸 어떻게 컨트롤 할껀지에 대해 배울 것입니다.

Untitled 1


Lesson 2: The Dot - . any character / ./ Period

카드게임에서 조커는 와일드카드이면서 댁에 있는 카드 중 어떠한 것들로 나타낼 수 있습니다. 정규표현식을 사용하면 패턴이나 구조(예를 들면 전화번호나 주소와 같이)를 공유한다는 사실 외에 정확한 내용을 모르는 택스트 조각과 일치하는 경우가 많습니다.

비슷하게, .(점) 메타케릭터가 와일드카드의 개념을 가지고 있습니다. 그리고 이건 어떠한 한개의 문자와 매칭할 수 있습니다. (글자, 숫자, 공백, 이외 전부). 당신은 기존 마침표와의 일치를 무시한다는 것을 알 수 있습니다. 따라서 마침표를 정확하게 일치시키기 위해선, 슬래시 . 를 사용하여 기존 마침표와 구별해야 합니다.

아래에 같은 길이이지만 다양한 문자를 가지는 문자열들이 있습니다. 먼저 3개의 문자열을 매칭할 수 있지만 마지막 문자열은 아닌(스킵될 수 있는) 하나의 패턴을 작성 해 보세요. 당신은 몇몇 문장에서 그 범위에 맞추기 위해 . 메타케릭터를 사용하지 말아야 할 수 있습니다.

Untitled 2

3개의 문자들을 맞추기 위해선 ...\. 를 사용할 수 있고, 마침표를 일치시키기 위해 최종 와일드카드 메타 케릭터를 탈출시킬 수 있습니다.


Lesson 3: Matching specific characters - [abc] Only a, b or c

저번 수업시간에서 배운 점(.) 메타케릭터는 꽤나 강력하지만 때떄로 너무 과하게 강력해. 예를 들어서 우리가 휴대폰 번호를 맞춘다고 했을 때, 우리는 "(+ab)-cdef-ghij" 와 같은 문자가 유효한 숫자인지 확인하고 싶어하지 않아해!

대괄호 안에 정의하는 정규 표현식을 사용하여 특정한 문자를 매칭하기 위한 방법이 있어. 예를 들어, [abc] 라는 패턴은 오직 하나의 a, b, c 문자에만 부합하고 다른것과는 부합하지 않아.

아래 여러줄에서, 처음에 오는 3개의 문자열만 매칭하고 마지막 3개의 문자열은 매칭하지 않길 원해. 우리가 만약 .(점) 을 쓴다면 마지막 3개의 문자열이 매칭되는것을 피할 수 없지만, 위의 표기법을 사용하여 일치시킬 문자를 구체적으로 정의할 수 있어.

Untitled 3

다른 줄에있는 것들은 매칭하지 않고, 'can', 'man' 그리고 'fan'만 맞추기위해선 정규표현식 [cmf]an 을 사용할 수 있어, 너가 다음 수업에서 볼 수 있듯이 반대로 [^drp]an 이런 정규표현식을 사용한다면 앞 3문자 'd','r','p'로 시작하지 않고 an으로 끝나는 문자를 찾을 수 있어. (역주)위 답이 [cmf]an 말고도 [^drp]an 도 가능하다는 이야기입니다.


Lesson 4: Excluding specific characters - [^abc] Not a, b or c

몇몇 상황에선, 우리는 같이 포함되지 않길 원하는 특정된 문자들이 있다는것을 알고있어. 예를 들면, 휴대전화에서 지역 코드 650은 포함 안되는 휴대폰 번호들을 찾고싶어하는 상황이야.

이런걸 나타내기 위해선, 우리는 대괄호^ (hat) 을 사용하는 특정 문자들을 제외하는 표현을 사용할 수 있어. 예를 들면 패턴 **[^abc]**는 문자 a, b, c를 제외한 한 문자를 매칭해.

아래에 있는 문자열들을 가지고, 살아있는 동물들만 매칭하는 패턴을 한번 작성해봐. (hog, dog... 하지만 bog는 빼구). 이 유형의 대부분 패턴은 실제로 동일한 동전의 양면이기 때문에 지난 강의의 기술을 사용하여 작성 될 수 있다는 것을 명심해. 두가지 선택을 가짐으로서, 너만의 팬턴을 작성할 때 어떤게 더 쉽고 잘 이해 할 수 있는지 정할 수 있어.

Untitled 4

가장 간단한 해결방법은 'og' 로 끝나고 'bog'만 매칭하지 않는 '[^b]og` 표현이야. 반대로 이전 단원에서 배운것을 사용하면 '[hd]og'를 사용할 수 있지. 이건 'hog'와 'dog'를 매칭하고 'bog'는 매칭하지 않아. 이게 조금더 제한적인 표현이라는 것을 알아둬. 왜냐하면 이건 매칭될 수 있는 문자열이 제한되니깐.


Lesson 5: character ranges - [a-z] Characters a to z / [0-9] Numbers 0 to 9 / \w Any Alphaumeric character / \W Any Non-alphaumeric character

우리는 방근 특정한 문자를 제외하거나 매칭하는 패턴을 만드는 방법을 배웠어 — 하지만 역속적인 문자 범위에 있을 수 있는 문자를 찾고 싶다면? 모두 나열하는 방법밖에 없을까?

운이 좋게도, 대괄호 표기법을 사용할 때 대시를 사용하여 문자 범위를 표시하여 연속 문자 목록에서 문자를 일치시키는 속기가 있어. 예를 들자면, 패턴 [0-6] 은 하나의 숫자 0~6 문자만 매칭하고 다른 문자는 매칭하지 않아. 그리고 비슷하게, [^n-p] 는 문자 n에서 p 를 제외한 하나의 문자를 매칭해주지.

여러개의 문자 범위는 개별 문자와 함께 같은 대괄호 안에서도 사용할 수 있어. 이거에 예시는 문자 범위 [A-Za-z0-9_] 와 동등한 영문자 \w 메타케릭터야. 그리고 영어 글에서 문자들을 찾을때 자주 사용하지.

아래 연습에서, 모든 매치해야하는 라인과 스킵해야하는 라인을 가지는 패턴이 있는지, 그리고 어떻게 대괄호를 각 라인으로부터 각 케릭터를 매칭하거나 스킵할때 사용할지 고민해봐. 패턴들은 대/소문자에 민감하다는 것과 문자 측면에서 a-zA-Z다르다는것을 명심해 (소문자 vs 대문자)

Untitled 5

모든 문자들은 연속적이라서, 처음 3줄을 매칭하기 위해 다른 범위 [A-C][n-p][a-c] 표현을 사용할 수있어.


Lesson 6: Catching some zzz's - {m} m Repetitions / {m,n] m to n Repetitions

메모: 모든 정규 표현식 구현에 아래에 있는 반복 문법 중 몇몇이 지원이 안되있어.

우리는 매칭하고 싶은 문자의 범위를 특정시키는 것을 배웠지만, 우리가 매칭하고 싶은 문자가 몇번 반복되는지에 대한건 어덯게 생각하니? 한가지 방법은 우리가 원하는 양의 문자를 정확하게 스팰링을 분리해 지정하여 매칭할 수 있어, 예를들면 정확하게 숫자 3개를 매칭하는 \d\d\d 로 말이지.

각 문자가 얼마나 반복되는지 지정하는 더 편리한 방법은 중괄호 표기법을 사용하는거야. 예를 들면, a{3} 정확하게 문자 3번을 매칭할꺼야. 특정 정규 표현식 엔진에서는 심지어 반복의 범위도 지원할 수 있어 예를 들면 a{1,3} 과 같이. 이건 1이상 3이하의 반복을 매칭해줘.

이 수량자는 어떠한 문자나 특별한 메타케릭터와도 사용할 수 있어. 예를 들면 w{3} (3개의 w들), [wxy]{5} (5개의 문자들, 각각은 w, x, y 가 될 수 있음) 그리고 .{2,6} (어떠한 문자 (Lesson2 참고) 2~6개).

아래 라인에서, z 가 하나 뿐인 마지막 문자열 "wazzup?" 은 속어의 적절한 스팰링이 아니야. 위에 나와있는 중괄호 표현식을 사용함으로써 아래 주어진 처음 2개 스팰링들만 매칭하는 패턴을 작성해봐.

Untitled6

우리가 매칭해야하는 처음 2개의 라인에서 여러개의 'z'가 있어, 그래서 표현식 waz{3,5}up 은 여러개의 z를 매칭할꺼야.


Lesson 7: Mr. Kleene, Mr. Kleene - * Zero or more repetitions / + One or more repetitions

정규 표현식의 강력한 개념은 임의의 숫자 문자를 매치하는 능력이야. 예를 들면, 달러로 숫자적인 표현을 기부 필드가 있는 형식을 작성했다고 해보자. 돈 많은사람이 25,000 달러를 기부하고싶고 일반적인 사람이 25달러를 기부할꺼야.

이러한 패턴을 표현하는 방법은 0 아니면 그 이상이라고 나타내는 Kleen Star 와 1아니면 그 이상을 나타내는 Kleene Plus 를 사용하는 거야. (항상 그 캐릭터나 그룹을 따라) 예를 들면, 위에 나타나있는 기부를 매핑하기 위해선 임의의 자릿수를 매치하는 \d* 패턴을 사용할수 있고, 더 엄격하게 적어도 하나의 숫자를 표현하는 \d+ 패턴을 사용할 수 있어.

이러한 수량기는 예를들면 a+( 하나 이상의 a들), [abc]+(하나 이상의 a b c중 어떠한것들) .*(0 아니면 그 이상의 어떠한 케릭터) 와 같이 어떤 캐릭터나 특별한 매타케릭터와 함께 사용할 수 있어.

별과 덧셈 메타캐릭터 두가지를 사용하여 아래에 있는 몇가지 간단한 문자열을 맞춰봐.

Untitled 7

최소한 2개의 'a' 와 0이상의 'b', 최소 한개의 'c' 를 맞추기 위해선, 정확하게 aa+b*c+ 를 사용할 수 있어. 또 다른 방법은, 더 제한된 표현인 각각 최대 최소 경계값을 두어서 a{2,4}b{0,4}c{1,2} 표현을 사용할 수 있어.


Lesson 8: Characters optional

이전 섹션에서 봤듯이, Kleen Star와 Plus는 한 라인에 반복되는 문자를 찾게 해줘.

텍스트를 매칭하고 추출할때 흔하게 사용하는 또다른 수량자는 선택을 나타내는 ? (물음표) 야. 이 문자는 0개나 선행 문자나 그룹을 찾게 해줘. 예를들면, 패턴 ab?c 는 “abc” 나 “ac” 둘다 찾게 해줘 왜냐하면 b는 선택사항으로 간주되기 때문이지.

점 문자와 비슷하게, 물음표 는 특수문자기 때문에 슬래쉬를 사용해서 이스케이프를 해야해. ?

아래의 문자열에서, 찾은 파일의 갯수에 따라 단어 “file”가 어떻게 변하는지 주목해봐.

1개 또는 1개 이상의 파일을 찾았다는 줄만 찾기 위해 물음표 문자를 써봐.

Untitled 8

파일의 수를 나타내는 것은 메타케릭터 ‘\d’를 사용할 수 있고 ‘\d+ files? found?’ 표현은 파일을 찾은 줄만 찾게 해줘. 첫번째 물음표 문자는 앞에 ‘s’ 문자(복수를 나타내는)에 적용되고, 실제 물음표는 이스케이핑 되어야 합니다.


Lesson 9: All this whitespace

로그 파일이나 유저 인풋과같은 실제 상황에서 입력을 다룰때, 쉽게 공백을 찾을 수 있어. 우리는 공백을 정보를 쉽게 읽고 스캔할 수 있게 정보를 형식화할때 사용할수도 있고, 하나의 공백이 간단한 정규 표현을 망칠수도 있어.

정규 표현과 함게 사용하게 될 흔한 공백 형식은 space (), 텝 (\t), 개행 (\n) 그리고 캐리지 리턴 (\r) (윈도우 환경에서 유용합니다) 이야. 그리고 이러한 특수 문자들은 각각의 반복적인 공백을 가져. 게다가, 공백이라는 특수 문자 \s 는 위에 나온 특정 공백들중 어떤것이든 찾고, 인풋 텍스트 자체를 다룰때 매우 유용해.

아래 문자열중에서, 각각 의 줄의 내용에서 각 줄의 인덱스에 공백이 있는것을 볼 수 있을꺼야. (숫자도 매치해야하는 일부야). 숫자와 내용이 있는 사이에 있는 공맥 문자들을 포함하는 각 라인을 찾을수 있는 패턴을 작성해보자.

Untitled 9

우리는 리스트 숫자와 ‘abc’ 사이에 스페이스가 있는 라인만 찾아야해. 우리는 ‘\d.\s+abc’ 표현을 사용하여 숫자, 마침표 (반드시 이스케이프 해야합니다), 한개 이상의 공백문자를 매칭할 수 있어. 만약에 Kleene Plus 대신 Kleene Star를 사용했다면 스킵해야할 4번째 라인도 포함되었을꺼야.