Regular Expression

공부의 기록·2021년 11월 23일
0

Dev Computer Science

목록 보기
8/18
post-thumbnail

정규표현식

정규표현식은 문자열에 나타나는 특정 문자 조합과 대응시키기 위해 사용되는 패턴입니다.

각 언어군에 정규표현식과 매치되는 메소드를 사용하면 쉽게 사용할 수 있습니다.

본 문서는 주로 Javascript 와 일부 Java 를 기준으로 작성하였으며,
Javascript 공식 문서를 기준점으로 잡고 있습니다.

이론 및 퍼포먼스 관련은 이 포스트 를 참고하자.

2021년 12월 21일 에 아래 내용을 추가하였습니다.

정규표현식을 잘못 사용하거나 남용하면 성능이 급격히 하락하는 문제를 맞이할 수 있습니다. 다음의 포스트들을 참고하셔야 할 것 같습니다.

Top 10 Easy Performance Optimisations in Java
Regex (정규표현식) vs contains / find / in
정규표현식성능백트래킹


문법

문법 참고는 dreamcoding github
문법 설명은 정규표현식, 더이상 미루지 말자

기초 문법

/regex?/i

  1. / 는 표현식이라는 뜻
  2. regex? 는 정규표현식 패턴
  3. i 는 정규표현식 옵션 (플래그)

키워드

그룹 및 범위 키워드

Groups and ranges

| 또는
() 그룹
[] 문자셋
[^] 부정문자셋
(?:) 찾지만 기억하지는 않음

정량 키워드

Quantifiers

? 없거나 있거나

  • 없거나 있거나 많거나
  • 하나 또는 많이
    {n} n번 반복
    {min,} 최소
    {min,max} 최소, 그리고 최대

영역-타입 키워드

Boundary-type

\b 단어 경계
\B 단어 경계가 아님
^ 문장의 시작
$ 문장의 끝

문자 클래스

Character Class

\ 특수문자가 아닌 숫자
. 어떤 글자(줄바꿈 문자 제외)
\d digit 숫자 (digit 은 10진수)
\D digit 숫자 아님
\w word 문자
\W word 문자 아님
\s space 공백
\S space 공백 아님


코드예제

문자열의 숫자만 찾기

정규식 [0-9]+

코드

public class RegexTest{
  public static void main(String[] args){
  RegexTest obj=new RegexTest();
  
  text="MyPorfile123";		//	MyProfile123
  text=obj.transfer(text);	//	123
  }
  String transfer(String text){
    String arr[]=text.split("");
    text="";
    for(int i=0;i<arr.length;i++)
      text+=arr[i].matches("[0-9]+") ? text : "";
    return text;
  }
}

문자열의 소문자만 찾기

정규식 [a-z]+

코드

public class RegexTest{
  public static void main(String[] args){
  RegexTest obj=new RegexTest();
  
  text="MyPorfile123";		//	MyProfile123
  text=obj.transfer(text);	//	yrofile
  }
  String transfer(String text){
    String arr[]=text.split("");
    text="";
    for(int i=0;i<arr.length;i++)
      text+=arr[i].matches("[a-z]+") ? text : "";
    return text;
  }
}

문자열의 대문자만 찾기

정규식 [A-Z]+

코드

public class RegexTest{
  public static void main(String[] args){
  RegexTest obj=new RegexTest();
  
  text="MyPorfile123";		//	MyProfile123
  text=obj.transfer(text);	//	MP
  }
  String transfer(String text){
    String arr[]=text.split("");
    text="";
    for(int i=0;i<arr.length;i++)
      text+=arr[i].matches("[A-Z]+") ? text : "";
    return text;
  }
}

문자열의 각 자리 중 소문자, 대문자, 숫자를 찾고...

소문자는 대문자로 바꾸고, 대문자는 소문자로 바꾸고, 숫자는 그대로 두자.

정규식

[a-z]+ 후에 [A-Z]+ 후에 [0-9]+ 찾기

코드

public class RegexTest{
  public static void main(String[] args){
    RegexTest obj=new RegexTest();
    
    text="MyProfile123";		//	"MyProfile12"
    text=obj.transfer(text);	//	mYpROFILE12
    text=obj.transfer(text);	// 	MyProfile12
  }
  String transfer(String text){
    String arr[]=text.split("");
    text="";
    for (int i=0; i<arr.length; i++){
      text+=arr[i].matches("[a-z]+") ? arr[i].toUpperCase() : arr[i].matches("[A-Z]+") ? arr[i].toLowerCase() : arr[i];
    return text;
  }
}

연습용 사이트

사이트 링크 : https://regexr.com/5mhou
사이트 강좌 : https://www.youtube.com/watch?v=t3M6toIflyQ

기본 설명

gm flag 가 있다는 전제...

  • [✅] /......./gm

그룹 및 범위 키워드

  • [✅] gr(e|a)y
    grey 또는 gray를 검색하고 그룹 1인지 그룹 2인지 기억함
  • [✅] gr(?:e|a)y
    grey 또는 gray를 검색하고 그룹 1인지 그룹 2인지 기억하지 않음
  • [✅] gr(e|a|)y
    grey 또는 gray 또는 gry 를 검색하고 그룹 1인지 2인지 3인지 기억함
  • [✅] gr[ea]y
    grey 또는 gray 음
  • [✅] gr[abcde]y
    gray, grby, grcy, grdy, grey 찾음
  • [✅] gr[a-e]y
    gray, grby, grcy, grdy, grey 찾음
  • [✅] gr[a-c0-3]y
    gray grby grcy gr0y gr1 gr2y gr3y 을 기억함
    a~c 와 0~3 의 범위를 탐색
  • [✅] [a-zA-Z0-9]
    a~z 와 A~Z 와 0~9 의 범위를 탐색
  • [✅] [^a-zA-Z0-9]
    a~z 와 A~Z 와 0~9 의 범위를 제외하고 탐색

정량 키워드

  • [✅] gra?y
    gray 와 gray 를 찾음 (a가 있거나 없거나)
  • [✅] gra*y
    gray gry graay graaay graaaay graaaaay ...
    a 가 있거나 없거나 많거나
  • [✅] gra+y
    gray graay graaay graaaay graaaaay ...
    a 가 있거나 많거나
  • [✅] gray{2,3}y
    a 가 최소 2개 최대3 인 graay graaay 를 탐색

영역 키워드

\b

  • [✅] \bYa 단어의 뒤에 붙어 있는 Ya 를 찾음
    Ya, IDIYa. Yanolza 중에 1번째, 2번째를 찾음
  • [✅] Ya\b 단어의 앞에 붙어 있는 Ya 를 찾음
    Ya, IDIYa. Yanolza 중에 2번째, 3번째를 찾음

\B

  • [✅] \BYa 앞에 공백이 없는 Ya
    Ya, IDIYa, YaYaYa 중에 1번째, 2번째 Ya 와 3번째 [Ya]YaYa를 찾음
  • [✅] Ya\B 뒤에 공백이 없는 Ya

^

  • [✅] ^Ya 문장 앞에서 시작되는 Ya
  • [✅] Ya$ 문장 끝에 나오는 Ya

문자 키워드

.

  • [✅] . 모든 글자
  • [✅] . 특수문자인 온점( . )
  • [✅] [ 특수문자인 [
  • [✅] \d
  • [✅] \D
  • [✅] \w
  • [✅] \W
  • [✅] \s 공백
  • [✅] \S 공백 아님

연습

profile
2022년 12월 9일 부터 노션 페이지에서 작성을 이어가고 있습니다.

0개의 댓글