[Java] 정규 표현식 사용하기

Shef·2022년 1월 3일
0

Java

목록 보기
1/3
post-thumbnail

연습용 사이트: regexr.com/5mhou

정규표현식

문법 정리

Groups and ranges

Chracter
|또는
()그룹
[]문자셋, 괄호안의 어떤 문자든
[^]부정 문자셋, 괄호안의 어떤 문자가 아닐때

Quantifiers

Chracter
?없거나 있거나 (zero or one)
*없거나 있거나 많거나 (zero or more)
+하나 또는 많이 (one or more)
{n}n번 반복
{min,}최소
{min,max}최소, 그리고 최대

Boundary-type

Chracter예시
\b단어 경계정규식 : \btext\b 예시 문자열 매칭 결과 : text texts
\B단어 경계가 아님정규식 : text\B 예시 문자열 매칭 결과 : text texts
^문장의 시작
$문장의 끝

Character classes

Chracter
\특수 문자가 아닌 문자
.어떤 글자 (줄바꿈 문자 제외)
\ddigit 숫자
\Ddigit 숫자 아님
\w[a-zA-Z_]와 동일
\W[^a-zA-Z_]와 동일
\sspace 공백
\Sspace 공백 아님

Advanced

Chracter예시
(?:)찾지만 그룹에 포함 안됨
(?=)=앞 문자를 기준으로 전방 탐색정규식 : 500(?=M) 문자열 매칭 결과 : 500M 500
(?<=)=뒤 문자를 기준으로 후방 탐색정규식 : (?<=M)500 문자열 매칭 결과 : M500 500

Flag

Flag동등한  내장표현예시
Pattern.CASE_INSENSITIVE
(?i)대소문자 구분 x
(?i)^hello , Pattern.compile(^hello, Pattern.MULTILINE)
Pattern.MULTILINE(?m)
다중행 모드 사용.
각 행의 처음과 끝을
^와 $로 인식.
정규식 : ^hello
문자열 매칭 결과 :
hello
everyone
hello

정규식 : (?m)^hello
문자열 매칭 결과 :
hello
everyone
hello
Pattern.DOTALL(?s)
.가 개행문자 까지 포함하는 모든 문자로 매칭.
정규식 : hello.+hello
문자열 매칭 결과 :
hello
everyone
hello

정규식 (?s)hello.+hello
문자열 매칭 결과 :
hello
everyone
hello

정규표현식 자바에서 사용하기

String에서 바로 적용

  1. matches (일치하는지 확인)
    String something = "hello987";
    boolean result = something.matches("[0-9]");
    System.out.println(result); // false 
  1. replaceAll (정규표현식과 일치하는 모든 값 치환)
    String something = "hello987*-;";
    String newSomething = something.replaceAll("[^a-z0-9]","0");
    System.out.println(newSomething); // hello987000
  1. split (정규표현식과 일치하는 값 기준으로 나누기)
    String something = "hello987*-;";
    String[] somethings = something.split("[0-9]+");
    System.out.println(somethings[0]); // hello
    System.out.println(somethings[1]); // *-;

Pattern, Matcher 활용

  1. find() / 한번 호출할 때마다 문자열 앞에서부터 매칭되는 문자열 찾음
    String something = "hg2";
    Pattern pattern = Pattern.compile("[a-z]");
    Matcher matcher = pattern.matcher(something);

    System.out.println(matcher.find()); // true   -> h매칭
    System.out.println(matcher.find()); // true   -> g매칭
    System.out.println(matcher.find()); // false  -> g 다음에는 매칭되는 것 없음.
  1. find(), group(), group(int index) / 매칭되는 그룹을 반환

    String something = "hello987*-;hi66";
    Pattern pattern = Pattern.compile("([a-z]+)([0-9]+)");
    Matcher matcher = pattern.matcher(something);

    int count = 0;
    while(matcher.find()){
    	System.out.println(matcher.group()); 
        // hello987 (count = 0 일 때)    hi66 (count = 1 일 때)
     	
        System.out.println(matcher.group(0)); 
        // hello987 (count = 0 일 때)    hi66 (count = 1 일 때) 
    	
        System.out.println(matcher.group(1)); 
    	// hello    (count = 0 일 때)    hi (count = 1 일 때)
    	
        System.out.println(matcher.group(2)); 
    	// 987      (count = 0 일 때)    66 (count = 1 일 때)
    	
        count++;
    }	
  1. find(), start(), start(int group) / 매칭되는 그룹의 시작 인덱스를 반환
    String something = "hello987*-;hi66";
    Pattern pattern = Pattern.compile("([a-z]+)([0-9]+)");
    Matcher matcher = pattern.matcher(something);

    int count = 0;
    while(matcher.find()){
    	System.out.println(matcher.start()); 
        // 0 (count = 0 일 때)  11 (count = 1 일 때)
  
     	System.out.println(matcher.start(0)); 
        // 0 (count = 0 일 때)  11 (count = 1 일 때) 
  
    	System.out.println(matcher.start(1)); 
    	// 0 (count = 0 일 때)  11 (count = 1 일 때)
  
    	System.out.println(matcher.start(2)); 
    	// 5 (count = 0 일 때)  13 (count = 1 일 때)
    	count++;
    }	

0개의 댓글