정규식

서버란·2024년 9월 8일

자바 궁금증

목록 보기
15/35
  • Java에서 정규식을 사용하려면 문자열을 특정 패턴에 맞춰 분리하거나 매칭하는 데 활용할 수 있습니다. 이를 위해 String 클래스의 split(), matches(), replaceAll() 등의 메서드에서 정규식을 사용할 수 있습니다.

기본적인 정규식 메타문자

.: 모든 문자와 매칭 (단일 문자)
*: 0개 이상의 앞 문자가 반복될 수 있음
+: 1개 이상의 앞 문자가 반복될 수 있음
?: 0개 또는 1개의 앞 문자가 있을 수 있음
^: 문자열의 시작을 의미
$: 문자열의 끝을 의미
[]: 문자 클래스, 내부의 문자 중 하나와 매칭
예: [abc]는 'a', 'b', 'c' 중 하나와 매칭
|: OR (또는) 연산자
예: a|b는 'a' 또는 'b'와 매칭
\: 특수 문자를 이스케이프 처리 (메타문자 그대로 사용하려면)

특수 문자

\d: 숫자(0-9)와 매칭
\D: 숫자가 아닌 문자와 매칭
\s: 공백 문자(스페이스, 탭, 줄 바꿈)와 매칭
\S: 공백이 아닌 문자와 매칭
\w: 단어 문자 (알파벳, 숫자, 밑줄)
\W: 단어 문자가 아닌 것과 매칭

반복 횟수

{n}: 정확히 n번 반복
{n,}: 최소 n번 반복
{n,m}: n번에서 m번까지 반복

자주 사용하는 정규식 패턴

1) 공백 또는 탭

"\\s+"        // 하나 이상의 공백
"\\t"         // 탭 문자
"\\s{2,}"     // 2개 이상의 공백
"\\s+|\\t"    // 하나 이상의 공백 또는 탭 문자

2) 숫자로 시작하는 문자열

"\\d+"        // 하나 이상의 숫자
"\\d{3}"      // 정확히 3자리 숫자

3) 문자열 시작 또는 끝

"^abc"        // 'abc'로 시작하는 문자열
"xyz$"        // 'xyz'로 끝나는 문자열
"^\\d+$"      // 숫자만으로 이루어진 문자열 전체

4) 그룹과 OR 사용

"(apple|banana)"  // 'apple' 또는 'banana'와 매칭
"(\\d{3})-(\\d{4})" // '123-4567'과 같은 형식과 매칭

Java에서 정규식 사용하는 예시

1) 문자열 분리 (split)

String str = "word1    뜻1";
String[] parts = str.split("\\s{2,}"); // 2개 이상의 공백으로 분리

2) 문자열 매칭 (matches)

String str = "abc123";
boolean isMatch = str.matches("^abc\\d{3}$"); // 'abc'로 시작하고 숫자 3자리로 끝나는지 확인

3) 문자열 교체 (replaceAll)

String str = "word1\t뜻1";
String result = str.replaceAll("\\t", " "); // 탭을 공백으로 교체

코드에서 활용한 정규식 설명

String line = "593. dining room 식당";
String[] string = line.split("\\d+\\.\\s+", 2);
  1. 입력 문자열: "593. dining room 식당"
  2. 정규식으로 분리:
  • \d+는 "593"에 매칭됩니다.
  • \.는 "."에 매칭됩니다.
    \s+는 " " (마침표 뒤의 공백)에 매칭됩니다.
  1. 결과적으로 "593. " 부분을 기준으로 문자열을 두 부분으로 분리합니다:
  • string[0]은 무시되며
  • string[1]에는 "dining room 식당"이 들어가게 됩니다.

결론

  • 이 정규식은 숫자. 공백 패턴으로 시작하는 부분을 제외하고, 그 뒤에 나오는 단어와 뜻을 분리하는 데 사용됩니다.
  • split("\d+\.\s+", 2)를 통해 숫자와 마침표 및 공백을 제거하고 그 뒤에 있는 영단어와 뜻을 추출하는 역할을 합니다.
String[] wordAndMeaning = string[1].split("\\s{2,}|\t", 2);
  • \s{2,}: 2개 이상의 공백을 의미합니다.
  • |\t: 탭을 구분자로 사용합니다. |는 OR을 의미하므로, 2개 이상의 공백이나 탭이 나오면 그 부분을 기준으로 문자열을 분리합니다.
  • 2: split()의 두 번째 인자로 2를 주면, 최대 두 부분으로만 분리합니다. 즉, 첫 번째는 영단어, 두 번째는 뜻이 됩니다.
    정규식을 더 깊이 활용하면 문자열을 유연하게 처리할 수 있습니다.
profile
백엔드에서 서버엔지니어가 된 사람

0개의 댓글