관리 메뉴

개발 쥬스

Java의 정규표현식(Regular Expression) 핵심 정리 본문

Java

Java의 정규표현식(Regular Expression) 핵심 정리

DevJuice 2024. 11. 19. 21:16
반응형

✏️ 정규표현식의 의미

정규표현식(Regular Expression, RegEx)이란 텍스트 데이터에서 특정 문자열을 검색하기 위한 조건(패턴)을 의미합니다.

정규표현식을 활용하면 다량의 데이터 속에서 특정 패턴을 만족하는 문자열을들을 쉽게 찾아낼 수 있고, 특정 패턴 문자열에서 대소문자 변환, 일부 문자 삭제 등 쉽게 수정할 수 있는 장점을 가지고 있습니다. 

 

하지만 기능이 편리한 만큼 복잡한 문법 구조를 가지고 있고, 잘못된 정규 표현식을 활용하게 되면 성능 저하문제를 야기할 수 있어 항상 정규표현식을 다루기 위해서는 신중을 기해야 합니다.

 

 

✏️  정규표현식에 사용되는 핵심 기호 정리

📝 기본 메타 문자 정리

기호 설명
. 임의의 한 개 문자 일치함을 의미한다.
^ 문자열의 시작을 의미한다.
단, [] 안에 존재한다면 not을 의미한다.
$ 문자열의 끝을 의미한다.
[] 문자집합 구성원 중 하나와 일치함을 의미한다.
[^] [] 안에 일치하는 문자가 없어야 함을 의미한다.
^가 [] 안에 있으면 not을 의미하고, 밖에 있으면 시작점을 의미한다.
- 문자의 범위 또는 숫자의 범위를 표현할 때 나타낸다.
| OR을 의미한다.
() 문자집합의 그룹화를 의미한다. 캡쳐라고도 한다.

ex) (ab|bc) : "ab" 또는 "bc"와 일치하는 문자열
(abc): "abc"와 일치하는 패턴 (단, [abc]: "a" 또는 "b" 또는 "c"와 일치하는 문자열에서 []와 차이가 있다.)
{} 특정 문자의 개수를 지정하기 위해서 사용된다.

ex) a{3}: "a" 문자를 세 번 반복하기 "aaa"와 일치
a{2, }: "a"문자를 최소 두 번 이상 반복하기 "aa", "aaa",...
a{2, 4}: "a"문자를 최소 두 번에서 네 번까지만 출력하기
\t 탭 문자 찾기
\w 알파벳의 대소문자, 숫자, 밑줄과 일치
\W \w의 부정
\d 0이상 9이하의 숫자
\D \d의 부정
\b 단어와 비문자와의 결계점 부분을 말함.

ex) "test\\b" 같은 경우는 st를 찾지만, "tester"의 st는 st 뒷부분이 문자로 구성되어 있으므로 찾지 않는다.
\B \b의 부정
\s 공백 문자를 의미함. (\n(줄바꿈), \r(캐리지 리턴), \t(탭) 등을 포함하고 있음)
\S \s의 부정

 

 

📝 수량 기호

기호 설명
? ?앞에 있는 표현식 0번 이상 한 번 이하로 나타냄

ex) colou?r: ? 앞의 u가 없거나 한 번 나타남 즉, "color", "colour"와 매칭됨
* * 앞에 있는 표현식이 적어도 0번 이상 나타남

ex) ab*: "a", "ab", "abb", "abbb"...와 매칭된다.
+ + 앞에 있는 표현식이 적어도 1번 이상 나타남

ex) ab+: "a"는 매칭이 안되고 "ab", "abb",...과 매칭된다.
{n} 앞의 표현식이 n번만 나타남.

ex) a{3}: "aaa"와 일치
{n, m} 앞의 표현식을 만족하는 문자가 n개 이상 m번 이하로 나타남
{n, } 앞의 표현식을 만족하는 문자가 최소 n번 이상 나타남

 

참고로 ?와 달리 다른 수량 기호들은 보통 greedy(탐욕) 방식으로 가능한 많은 문자를 탐구하지만, ?는 다른 수량적 기호와 함께 쓰이게 되면 non-greedy(비탐욕) 방식으로 최소한으로 특정 문자를 탐구하게 됩니다.

 

예를 들어 "<div>example</div>" 의 문자열이 존재한다고 했을 때 다음 방식과 같이 탐구를 하게 됩니다.

1️⃣ <.*>:  "<div>example</div>"전부를 탐구하게 됨
2️⃣ <.*?>: <div>, </div>만 탐구하게 됨

 

 

📝 역참조, 전후방탐색, 조건부탐색

패턴 설명
(pattern) 하위 표현식의 정의이다. 특정 pattern을 만족하는 문자열이 있으면 매칭한다.
\1, \2,.... 그룹핑 한 것들 중에서 번호가 부여(그룹핑 한 순서대로)되는데 특정 그룹을 지정하여 다시 출력을 하라는 의미이다.

ex) (\\w+)\\s+\\1의 패턴이 있고, "hello hello world"의 문자열이 있다고 한다면
\\w+의 패턴이 그룹핑이 되어 있고, 처음으로 그룹핑이 되어 있으므로 1번으로 매칭이 된다.
즉 "hello "의 문자열 뒤에 1번 그룹핑을 한 번 더 적용하라는 의미이므로 "hello hello"가 된다.
(?=pattern) 전방탐색을 의미한다.

ex) "\\w+(?=\\d)"의 패턴이 존재하고, 문자열은"abc123 xyz45"이 있다고 가정할 때
"abc12"와 "xyz4"를 매칭한다. 즉, 숫자 앞에 영어 또는 숫자로 구성된 문자열을 탐색하는 것이다.
(?!pattern) 전방탐색의 부정을 의미한다.

ex) "foo(?!bar)"의 패턴이 존재하고, 문자열은 "foobar foo"가 존재할 때
문자열에서 두 번째 "foo"를 매칭한다. 즉, "foo"가 앞에 있으며 뒤에 "bar"가 붙지 않는 문자열을 탐색한다.
(?<=pattern) 후방탐색을 의미한다.

ex) "Price: $200" 의 문자열이 존재하고, "(?<=\\$)\\d+"의 패턴을 적용하면
"200"을 매칭하게 된다. 즉, $가 앞에 붙은 숫자를 모두 탐색하게 된다.
(?<!pattern) 후방탐색의 부정을 의미한다.

ex) "Price: $120"의 문자열이 존재하고, "(?<=\\$)\\d+"의 패턴을 적용하면
"20"을 매칭한다. 즉, $가 앞에 붙은 숫자를 제외한 숫자를 매칭하게 된다.
(?:pattern) 해당 패턴을 찾지만 그룹에 포함시키지 않음을 의미한다. 정규표현식에서는 일반적으로 특정 패턴을 찾으면 이를 그룹핑하는 캡처 방식을 사용하는 것이 기본이지만, 캡처하지 않음으로써 불필요한 내용을 메모리에 저장시키지 않는 효과를 나타낸다.

 

정규표현식에서 캡처하여 저장한다의 의미를 이해하고 싶어서 다음 예시 코드를 작성해보았습니다.

import java.util.regex.*;

public class Main {
    public static void main(String[] args) {
        String text = "John Doe";
        String pattern = "(\\w+) (\\w+)"; // 두 개의 단어를 캡처
        String replacement = "$2, $1"; // 캡처된 두 번째 그룹과 첫 번째 그룹의 순서를 바꿔 출력

        String result = text.replaceAll(pattern, replacement);
        System.out.println("Replaced Text: " + result); // 결과: "Doe, John"
    }
}

위 코드와 같이 패턴에 맞게 John과 Doe를 각각 캡처하여 replacement에서 그룹 번호를 매핑하여 주소를 참조하며 활용할 수가 있습니다. 하지만 (?:pattern)을 활용하게 되면 이를 그룹화하지 않게 되어 정보를 저장하지 않습니다.

 

📝 대표적인 예시 소개

정규표현식 설명
\w+@\w+\.\w+(\.\w+)? 이메일 형식의 한 예시

ex) abc@abc.com, abc@abc.co.uk
\d{6}-[1-4]\d{6} 주민등록번호의 한 예시
^01(?:0|1|[6-9])-(?:d{3}|d{4})-\d{4}$ 휴대폰번호의 한 예시
^\d{2, 3}-\d{3, 4}-\d{4}$ 전화번호의 한 예시

 

 

📝 레퍼런스

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%A0%95%EA%B7%9C%EC%8B%9DRegular-Expression-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%A0%95%EB%A6%AC#%EC%A0%95%EA%B7%9C%EC%8B%9D_%EB%AC%B8%EB%B2%95_%EA%B8%B0%ED%98%B8_%EB%AA%A8%EC%9D%8C

 

☕ 자바 정규식(Regular Expression) 사용법 💯 정리

정규표현식 이란 정규표현식(Regular Expression)이란 문자열 데이터 중에서 원하는 조건(패턴)과 일치하는 문자열 부분을 찾아내기 위해 사용하는 것으로, 미리 정의된 기호와 문자를 이용해서 작성

inpa.tistory.com

 

https://m.blog.naver.com/cjinnnn/221329842667

 

[정규표현식] 정규표현식 정리, 정규식

[정규표현식] 정규표현식 정리   정규표현식(正規表現式, Regular Expression)은 문자열을 처리하는...

blog.naver.com

 

https://javarush.com/en/groups/posts/en..regular-expressions-in-java-regex

 

Regular Expressions in Java (RegEx)

are a topic that programmers, even experienced ones, often put off until later. However, most Java developers will sooner or later have to deal with text processing. Most often - with search operations in the text and editing. Without regul

javarush.com

 

반응형