정규표현식

sameul__choi·2021년 12월 13일
0

정규 표현식이란 ?

프로그래밍에서 문자열을 다룰 때, 문자열의 일정한 패턴을 표현하는 일종의 형식 언어를 뜻합니다. 정규식이라고 부르며, 보통 regex 혹은 regexp라고 씁니다.

  • 프로그램 작성시 일정한 규칙을 가진 텍스트 문자열을 사용하는 경우가 많은데, 이럴 때 정규 표현식을 사용합니다. 특히 컴파일러의 파서 부분은 이 정규 표현식이 반드시 들어갑니다.
  • 유닉스 계열에서 CLI 환경에서 사용하는 grep sed awk 같은 명령어를 사용할 때 거의 필수적으로 마주하게 되는 언어입니다.
  • 전화번호, 주민등록번호, 이메일 등 주로 정해져 있는 형식이 있고 유저가 그 형식대로 입력을 넣었는지 검증해야 하는 경우에 사용합니다.

작성 방법

정규 표현식을 작성할 때엔 Java API java.util.regex 패키지를 사용해야 합니다. 정규표현식을 사용할 때에는 클래스에 있는 Pattern 클래스와 Matcher 클래스를 주로 사용합니다.

Pattern 클래스

정규표현식 대상 문자열을 검증하는 기능은 Pattern 클래스의 matches() 메소드를 활용합니다. 이 메서드의 첫번재 매개값은 정규표현식이고 두번째 매개값은 검증 대상 문자열입니다. 검증 후 정규표현식과 일치하면 true, 그렇지 않으면 false를 반환합니다.

import java.util.regex.Pattern;

public class RegexExample {
	public static void main(String[] args)  {

	String pattern = "\\[[a-zA-Z0-9가-힣]+,\\d+,\\d+]";
	String val = "[진로,2500,3]";

	boolean regex = Pattern.matches(pattern, val);
	System.out.println(regex);
}

Pattern 주요 메서드

  • compile(String regex) : 주어진 정규표현식으로부터 패턴을 만듭니다.
  • matcher(CharSequence input) : 대상 문자열이 패턴과 일치할 경우 true를 반환합니다.
  • asPredicate() : 문자열을 일치시키는 데 사용할 수있는 술어를 작성합니다.
  • pattern() : 컴파일된 정규표현식을 String 형태로 반환합니다.
  • split(CharSequence input) : 문자열을 주어진 인자값 CharSequence 패턴에 따라 분리합니다.

Matcher 클래스

Matcher 클래스는 대상 문자열의 패턴을 해석하고 주어진 패턴과 일치하는지 판별할 때 주로 사용됩니다. Matcher 클래스의 입력값으로는 CharSequence라는 새로운 인터페이스가 사용되는데 이를 통해 다양한 형태의 입력 데이터로부터 문자 단위의 매칭 기능을 지원 받을 수 있습니다. Matcher객체는 Pattern객체의 matcher() 메소드를 호출하여 받아올 수 있습니다.

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

public class RegexExample {
	public static void main(String[] args)  {
            Pattern pattern = Pattern.compile("\\[[a-zA-Z0-9가-힣]+,\\d+,\\d+]";);
            String val = "[카스,1500,3]"; 
	
            Matcher matcher = pattern.matcher(val);
            System.out.println(matcher.find());
	}
}

정규 표현식 문법

Metacharacters

metacharacters는 Regex의 패턴에서 어떤 문자가 특별한 의미를 갖는 것을 말합니다. 예를 들어, ₩d 는 0에서 9사이의 숫자를 의미합니다.

Quantifiers

Quantifiers는 요소들을 얼마나 반복시킬지 정의합니다.

Regex를 지원하는 String 메서드

  • String.matches(regex)
    - String이 regex와 일치하면 true 리턴

  • String.split(regex)
    - regex와 일치하는 것을 기준으로 String을 분리하여 배열로 리턴

  • String.replaeceFirst(regex, replacement)
    - regex와 가장 먼저 일치하는 것을 replacement로 변환

  • String.replaceAll(regex, replacement)
    - regex와 일치하는 모든 것을 replacement로 변환

예제

@Test
public void ex9() {
    String pattern = "a*[0-9]*";
    assertTrue("aaa123".matches(pattern));

    pattern = "\\s";
    String arr[] = "Hello World Java Regex".split(pattern);
    System.out.println(Arrays.asList(arr));

    pattern = "Hello";
    System.out.println("Hello World Hello World ".replaceFirst(pattern, "Regex"));

    pattern = "Hello";
    System.out.println("Hello World Hello World ".replaceAll(pattern, "Regex"));
}

0개의 댓글