DevLog:-)

정규표현 - [프로그래머스 스쿨] 본문

프론트엔드

정규표현 - [프로그래머스 스쿨]

hyeon200 2023. 7. 10. 21:48
반응형
 

정규표현식

현재 IOS/안드로이드 앱 내에서는 결제를 지원하지 않습니다.

school.programmers.co.kr

"프로그래머스 스쿨 정규표현식 수강 후 공부한 내용을 정리한 글입니다:D"

 

 

정규표현식이란?

 

문자열을 처리하는 방법 중의 하나로 특정한 조건의 문자를 '검색'하거나 '치환'하는 과정을 매우 간편하게 처리할 수 있도록 하는 수단이다.

 

 

 

다음은 파이썬 예제입니다. 

1. 대표문자(Meta sequence)

-숫자 대표 문자 

\d : 숫자를 대표하는 정규표현식이다. 

      d는 digit을 뜻한다.

-글자 대표 문자

\w : 글자를 대표하는 정규표현식이다. 

      'a, b, c, 가, 나, 다, 1,  2'와 같은 문자와 숫자를 포함('_'(언더스코어)는 포함)

 

search_target = '''Luke Skywarker 02-123-4567 luke@daum.net
다스베이더 070-9999-9999 darth_vader@gmail.com
princess leia 010 2454 3457 leia@gmail.com'''

import re

regex = r'\d' #search_target에서 숫자만 출력된다. 
result = re.findall(regex, search_target)
print("\n".join(result))


regex = r'\w' #글자만 풀력된다. 
result = re.findall(regex, search_target)
print("\n".join(result))

파이썬 예제입니다. 

 

2. 횟수 정하기(Quantifier) 

-하나 이상

\d+ : 연결된 숫자 표현하고 싶을 때 +사용

 

-0개 이상

\d* : 숫자가 0개 이상 표현하고 싶을 때 *사용

ex) [1-9]\d* : 자연수 구하기 (처음에 1~9 중 하나의 숫자 나온 다음, 드 뒤에 숫자가 0개 이상 온다.)

 

-있거나 없거나

? : 있거나 없거나 

ex) \d+[-]?:연속된 숫자 뒤에 -있거나 없음

      \d+[- ]?\d+[- ]?\d+ ; 연속된 숫자 사이에 '-' 또는 공백이 있거나 없음

 

-n 번

숫자 반복 횟수 제한하기 

{숫자}: 숫자번 반복한다"

ex) \d {2} : 숫자 연속 두 번 나옴

 

-n~m번

{숫자 1, 숫자 2}는 "숫자 1부터 숫자 2까지 반복한다"는 뜻

ex) \w {2,3} : 문자가 2 ~ 3번 나옴

 

search_target = '''Luke Skywarker 02-123-4567 luke@daum.net
다스베이더 070-9999-9999 darth_vader@gmail.com
princess leia 010 2454 3457 leia@gmail.com'''

import re

regex = r'\d+' #연결된 숫자가 출력된다. 
result = re.findall(regex, search_target)
print("\n".join(result))

regex = r'[1-9]\d*' #0개 이상의 연속된 자연수 
result = re.findall(regex, search_target)
print("\n".join(result))

regex = r'\d+-?\d+-?\d+' # 연속하는 숫자 사이에 '-'있거나 없다
result = re.findall(regex, search_target)
print("\n".join(result))

regex = r'\d+[- ]?\d+[- ]?\d+' # 연속하는 숫자 사이에 '-' 또는 공백이 있거나 없다
result = re.findall(regex, search_target)
print("\n".join(result))

regex = r'\d{2}[- ]?\d{3}[- ]?\d{4}' # 제한된 연속하는 숫자 사이에 '-' 또는 공백이 있거나 없다
result = re.findall(regex, search_target)
print("\n".join(result))

regex = r'\d{2,3}[- ]?\d{3,4}[- ]?\d{4}' # 숫자1부터 숫자2까지 반복 연속하는 숫자 사이에 '-' 또는 공백이 있거나 없다
result = re.findall(regex, search_target)
print("\n".join(result))

파이썬 예제입니다. 

 

3. 고르기 

- 몇 개 중에 고르기

ex) [aeiou] : 알파벳 중에 소문자 모음(a, e, i, o, u)만 고르기

- 범위에서 고르기

ex) [abcdefghijklmnopqrlstuvwxyz] = [a-z]

- 한글 고르기

ex) '[가-힣]+':  #한글 단어

 

search_target = '''Luke Skywarker 02-123-4567 luke@daum.net
다스베이더 070-9999-9999 darth_vader@gmail.com
princess leia 010 2454 3457 leia@gmail.com'''

import re
 
regex = r'[aeiou]+' #aeiou만만 고르기
result = re.findall(regex, search_target)
print("\n".join(result))

regex = r'[a-z]' #소문자
result = re.findall(regex, search_target)
print("\n".join(result))

regex = r'[a-z]+' #연속하는 소문자
result = re.findall(regex, search_target)
print("\n".join(result))

regex = r'[가-힣]+' # 한글 단어
result = re.findall(regex, search_target)
print("\n".join(result))

파이썬 예제입니다. 

 

4. 기타 대표 문자 

숫자(\d)나 글자(\w) 이외에도 다양한 대표 문자가 있다. 

^ 문자열의 시작
$ 문자열의 끝
. 임의의 한 문자
* 문자가 0번 이상 발생 ( = {0,})
+ 문자가 1번 이상 발생 ( = {1,})
? 문자가 0번 혹은 1번 발생 ( = {0, 1})
[ ]  문자의 집합 범위를 나타냄

[0-9] : 숫자 (0부터 9)
[a-z] : 알파벳 (a부터 z)

앞에 ^가 나타나면 not을 의미
{ }  횟수 또는 범위를 의미

{n} : 앞 문자가 n개
{n,} 앞문자가 n개 이상
{n, m}: 앞 문자가 n개 이상, m개 이하
( )  소괄호 안의 문자를 하나의 문자로 인식
|  or 조건
\ 확장 문자의 시작 
\b 단어의 경계
\B 단어가 아닌 것의 경계
\A 입력의 시작부분
\G 이전 매치의 끝
\Z 입력의 끝이지만 종결자가 있는 경우
\z 입력의 끝
\s 공백문자
\S 공백문자가 아닌 나머지 문자
\w 알파벳이나 숫자
\W 알파벳이나 숫자를 제외한 문자
\d [0-9]와 동일
\D 숫자를 제외한 모든 문자

 

5. 프로그래밍 언어별 정규표현식

-자바 정규표현식

주의할 점: Java에서는 \ 대신 \\를 적어야 한다.

Python은 raw string을 지원해 대표 문자 1을 표현할 때 역슬래시 \ 를 한 번만 쓸 수 있다.

하지만 자바에서는 escape 때문에 역슬래시를 사용해 역슬래시 \를 두 번 적어야 한다.

import java.io.Console;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class MyRegex{
    public static void main(String[] args){
        String searchTarget = "Luke Skywarker 02-123-4567 luke@daum.net\n다스베이더 070-9999-9999 darth_vader@gmail.com\nprincess leia 010 2454 3457 leia@gmail.com";

        Pattern pattern = Pattern.compile("\\d");
        Matcher matcher = pattern.matcher(searchTarget);
        while(matcher.find()){
            System.out.println(matcher.group(0));
        }
    }
}

 

 

-자바스크립트 정규표현식
Javascript로 정규표현식을 다룰 때에는 String class의 match 함수를 이용할 수 있다.

var searchTarget = "Luke Skywarker 02-123-4567 luke@daum.net\
다스베이더 070-9999-9999 darth_vader@gmail.com\
princess leia 010 2454 3457 leia@gmail.com";

/* 아래 코드의 /와 /g가운데에 정규표현식을 넣으세요.
 * g는 global의 약자로, 정규표현식과 일치하는 모든 내용을 찾아오라는 옵션입니다.
 */
var regex = /\d+/g;    // 여기에 정규표현식을 입력
console.log(searchTarget.match(regex));

 

 

-C#정규표현

C#으로 정규표현식을 다룰 때에는 Regex.matches라는 메서드를 이용한다.
주의할 점: C#에서는 \ 대신 \\를 적어야 한다.  (자바와 같은 이유)

using System;
using System.Text.RegularExpressions;

public class RegexTest {
    public static void Main() {
        string regex = "\\d";
        string searchTarget = "Luke Skywarker 02-123-4567 luke@daum.net\n다스베이더 070-9999-9999 darth_vader@gmail.com\nprincess leia 010 2454 3457 leia@gmail.com";

        foreach (Match m in Regex.Matches(searchTarget, regex)){
            Console.WriteLine(m.Value);
        }
    }
}

 

 

 

 

 

반응형