[Java] 정규표현식

이대건·2024년 2월 20일

Java

목록 보기
11/17
post-thumbnail

자바 공식문서를 보던중 StirngTokenizer는 legacy로 String.split 사용을 권장하는 문구를 확인했다.
더 권장되는 split을 사용하기 위해 정규표현식을 알아보자.

기본 토큰 파싱

StringTokenizer(이하 ST)의 매개변수에 문자열만 넣었을 때 파싱되는 것을 기본 토큰 파싱이라고 한다.(공백을 기준으로 파싱)

  • 다음 코드는 ST에 완벽히 대응된다.
  • 자바에서 \는 escape 문자로 문자열에 ' 또는 " 또는 \를 사용할 때 앞에 적어주어야 한다.
  • 공식문서에서는 "\s"라고 적혀있지만 연속된 공백이 있는경우 ST에 대응되지 않는다.
  • 따라서 하나 이상의 연속된 공백문자를 기준으로 분할하는 "\s+"를 사용해야 한다.
	String s = "for the last week"
    String[] parsedStr = s.split("\\s+");

공백 하나: \s

  • 공백문자 하나를 구분자로 간주하여 분할
  • 다음과 같이 공백이 두 번 들어간 문장에서 예상치 못한 동작
	String s = "for  the  last  week";
    String[] parsedStr = s.split("\\s");

parsedStr = "for" | "" | "the" | "" | "last" | "" | "week"

  • ST를 사용했더라면 ""는 토큰화되지 않는다.

공백 여러개: \s+

  • 하나 이상의 연속된 공백문자를 하나의 구분자로 간주하여 분할
  • 다음과 같이 공백이 두 번 들어간 문장에서 ST와 동일하게 동작
	String s = "for  the  last  week";
    String[] parsedStr = s.split("\\s+");

parsedStr = "for" | "the" | "last" | "week"

숫자 하나: \d

  • 숫자 하나를 구분자로 간주하여 분할
  • 응용하여 날짜 검색에 사용할 수 있다.
    • yyyy-mm-dd
      • \d{4}-\d{2}-\d{2}

숫자 여러개: \d+

  • 하나 이상의 연속된 숫자를 하나의 구분자로 간주하여 분할

split의 한계

  • split으로 다음과 같은 파싱은 어려워보인다(필자가 부족하기 때문일수도 있다.)
  • 이유는 ST의 세번째 매개변수로 true를 넘기면 구분자도 토큰에 포함시킬 수 있지만 split은 구분자를 제거해버린다.
    String s = "for  the  last  week";
    StringTokenizer st = new StringTokenizer(s, " ", true );

tokens = "for" | " " | " " | "the" | " " | " " | "last" | " " | " " | "week"

각종 범위

  • [A-Z]
  • [a-z]
  • [0-9]
String s1 = "각종 범위: [ABCZ], [abcz], [0129]";
String s2 = s1.replaceAll("[A-Za-z0-9]", "");

s2 = 각종 범위: [], [], []

profile
일낸머스크

0개의 댓글