일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- 등산코스 정하기
- 24955
- MySQL
- 10기
- 142085
- 해결
- 싸피
- 산 모양 타일링
- 숫자 이어 붙이기
- 핵심
- 배열 돌리기 5
- 수료
- 오블완
- 14942
- 퍼즐 조각 채우기
- 프로그래머스
- SQL
- SSAFY
- 소프티어
- softeer
- 카카오코드 본선
- 정기 코딩 인증평가
- 인턴십
- 후기
- 설명
- 카카오
- 티스토리챌린지
- java
- PCCP
- 백준
- Today
- Total
개발 쥬스
Java의 정규표현식(Regular Expression) 핵심 정리 본문
✏️ 정규표현식의 의미
정규표현식(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}$ | 전화번호의 한 예시 |
📝 레퍼런스
☕ 자바 정규식(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