23.01.30. - 정규 표현식

김도익·2023년 1월 30일
0

C#

목록 보기
21/29

정규 표현식이란?

  • 문자열에 특정한 규칙, 조건이 있는 경우 식으로 정의하여 규칙에 맞는 문자열을 추출 및 활용할 때 사용합니다.

정규 표현식 장점

  • 코드가 길고 복잡해질 필요 없이, 정규 표현식 패턴으로 코드를 짧고 효율적으로 구성할 수 있습니다.

  • 문법은 언어마다 거의 동일합니다. 그러니 익혀둔다면 다른 프로그래밍 언어에서도 손쉽게 활용이 가능합니다.

정규 표현식 사이트

  • https://regexr.com 에서 정규표현식 문법을 활용해서 익힐 수 있습니다.

<정규 표현식 문법>

1. 그 단어를 찾아주세요!

  • 정규 표현식의 가장 기본적인 형태는 텍스트 패턴 탐색입니다.

    • 대소문자를 구분합니다.
    • 정규식에는 "플래그"라고 부르는 옵션이 있습니다. 대소문자를 구분하고 싶지 않다면 플래그에서 'i' ignorance 옵션을 주어야 합니다.
  • 프로그래밍 언어에서 사용되는 OR ’ | ’ 연산자를 사용할 수 있습니다.

  • 여기에 소괄호 ’ ( ) ’로 여러 그룹으로 묶어서 연산 하는 것도 가능합니다.

    // \g : 글로벌로 \g를 쓰지 않는다면 하나만 검색하고, 검색을 멈추기 때문에 \g를 쓰면 모든 것을 다 검색할 수 있습니다.

    // \w == [a-zA-Z0-9] 이기 때문에 [A-C]\g를 한다면 A,B,C만 찾게 됩니다.

2. 이 글자들 전부 찾아주세요 / 이 글자들 빼고 찾아 주세요!

  • “문자 그룹”을 사용하면 그룹에 포함된 / 포함되지 않은 문자를 찾을 수 있습니다.

  • 대괄호 ‘ [ 찾을 문자들 ] ’를 이용하면 괄호 안의 문자와 하나라도 일치하는 모든 부분을 찾습니다.

    • 알파벳 순서대로 일부를 탐색하려면 ‘ - ’ 를 사용하여 ‘ [시작 문자 - 끝 문자] ’의 형태로 나타낼 수 있습니다.

    • 하나의 대괄호 안에 여러 조건을 넣는 것도 가능합니다.

    • 한글도 가능합니다. 자음은 [ㄱ-ㅎ], 모음은[ㅏ-ㅣ], 한글 전체는 [가-힣]으로 범위를 지정할 수 있습니다.

  • 괄호 안에 ‘ ^ ’ 기호를 넣으면 괄호 안의 문자를 제외한 모든 문자를 찾습니다.

3. 대충 이런 글자였던거 같은데…?

  • “수량자”를 이용하면 특정 문자가 몇번 나오는지 관계없이 검색이 가능합니다.

    • 없거나 있거나 ‘ ? ’

    • 없거나 있거나 많거나 ‘ * ’

    • 하나 이상 있는 경우 ‘ + ’

    • 정확하게 수량 지정 ‘{ n }’

    • 최소 { min, } / 최대 { ,max } /최소 ~ 최대 ‘{ min, max }’

4. 특정 위치에 있는 글자만 찾고 싶어요

  • “앵커”를 사용하면 위치에 따른 검색을 할 수 있습니다.

    • ‘ \b ’ : 단어의 맨 앞 / 맨 뒤에 있는 문자를 찾고 싶을 때 조건의 앞 혹은 뒤에 적습니다.

    • ‘ \B ’ : 조건에 일치하는 문자를 검색하면서 ‘ \b ’조건에 맞는 문자는 제외합니다.

    • 문장에서는 ^과 $를 사용합니다. 맨 앞에 오는 경우 ‘ ^ ’ 맨 뒤인 경우 ‘ $ ’ 를 사용합니다.

      • 여러 문장이라는 것을 인식하려면 플래그에서 Multiline ‘ m ’ 옵션을 주어야 합니다.
      • ^와 $ 사용시 m 옵션이 없는 상태에서는 전체 범위를 하나의 문장인 것처럼 인식하고 탐색합니다.

5. 알파벳이 아닌 것도 찾을 수 있나요?

  • “문자 클래스”를 이용해서 찾을 수 있습니다.

    • 먼저 본 것과 같이 정규식 안에서 다른 용도로 사용되는 특수한 문자들(ex. 괄호, 연산자 등)을 리터럴로 받고 싶다면 문자 이스케이프()를 활용하면 됩니다.

      • 기호 하나에 대해서 적용되기 때문에 검색하고 싶은 리터럴이 “ ( ) ” 라면 ‘ () ’의 형식으로 지정해야 합니다.
    • 문자열 전체는 ‘ \w ’ 로 찾을 수 있습니다. 영어 기준 [a-zA-Z0-9] 와 동일한 결과를 보여줍니다.

      • ‘ \W ’ 는 문자열로 인식하지 못하는 모든 기호를 찾습니다. == [^a-zA-Z0-9]
    • 이 중에서 숫자 리터럴은 ‘ \d ’로 찾을 수 있습니다. [0-9] 와 동일한 결과를 보여줍니다.

      • 반대로 숫자가 아닌 모든 것(특수문자 포함)을 찾으려면 ‘ \D ’를 사용합니다. == [^0-9]

  • 마침표 ‘ . ’ 는 범위 전체를 지정합니다. 줄바꿈 문자(엔터)는 포함되지 않습니다.

  • 줄바꿈 문자를 검색하고 싶다면 ‘ \n ’ 을 사용하여 찾습니다. (n터~)

  • 공백문자 “ ” 는 ‘ \s ’를 사용합니다. 공백문자를 제외하는 경우는 ‘ \S ’ 입니다.

6. C#에서 활용

  • Regex Class 메서드

    • IsMatch() - 해당 문자열에서 일치하는 부분이 있는지 확인

    • Match() - 일치하는 부분을 하나 찾아 Match 객체로 반환

    • Matches() - 일치하는 부분을 모두 찾아서 MatchCollection 객체로 반환

    • Replace() - 해당 문자열에서 특정 문자열로 치환 수행

    • Split() - 문자열을 여러 문자열 배열로 나누게 됨.

예시 - 1

예시 - 2

예시 - 3

예시 - 4

  • match, matches 활용



예시 - 5

  • Split() : 문자열을 여러 문자열 배열로 나누게 됨

예시 - 6

  • 백준 14405번, Regex.Replace()사용하기

    // using System.Text.RegularExpressions를 사용하면 위에 구문처럼 길게 작성하지 않아도 됩니다.

예시 - 7

  • 백준 15881번

    // foreach는 아직 미해금 구역이기 때문에 나중에...ㅎㅎ

메타 문자


profile
고급 개발자가 되고 싶어요!

0개의 댓글