728x90
반응형
정규표현식 (Regular Expression)
- 문자열이 특정 패턴과 일치하는지 검사할 수 있는 표현식
- 특정 프로그래밍 언어에만 있는 것이 아닌 공통의 규칙
자바에서 정규표현식을 활용하기 위한 클래스
- java.util.regex.Pattern
Pattern.matches(regex, input) : input이 regex 의 패턴에 해당하는 문자열인지 검사하는 메서드
- [ ] 내부에서 사용하는 문법들
[abc] : a 또는 b 또는 c를 허용
[a-z] : a부터 z까지 모두 허용
[A-Z] : A부터 Z까지 모두 허용
[a-zA-z] : 모든 알파벳 허용
[a-f&&c-g] : 두 조건을 모두 만족하는 문자만 허용
- 하나로 여러 문자를 나타내는 것들
. : 모든 문자 허용, [.] 또는 \.은 .만 허용한다는 뜻
\d : 모든 숫자 허용
\D : 숫자를 제외한 모든 것을 허용
\s : 모든 공백 허용 (\t, \n, \r, ' ')
\S : 공백을 제외한 모든 것을 허용
\w : 일반적인 문자들을 허용 ([a-zA-z0-9_]와 같음)
\W : \w을 제외한 모든 것을 허용
- 해당 패턴이 적용될 문자의 개수를 지정하기
※ 정규표현식 내에서 보기좋으라고 띄어쓰기하면 에러남
.{n} : {} 앞의 패턴이 n개 일치해야 한다.
.{n,m} : {} 앞의 패턴이 n개 이상 m개 이하 일치해야 한다.
.{n,} : {} 앞의 패턴이 n개 이상 일치해야 한다.
.? : ? 앞의 패턴이 0번 또는 한 번 나와야 한다.
.+ : + 앞의 패턴이 최소 한 번 이상 나와야 한다.
.* : * 앞의 패턴이 0번 이상 나와야 한다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class D10_Regex {
public static void main(String[] args) {
// Pattern.matches(regex, input)
// : input이 regex의 패턴에 해당하는 문자열인지 검사하는 메서드
System.out.println(Pattern.matches("sleep", "sleep"));
// [] : 해당 위치에 허용할 문자를 정의하는 정규표현식 문법
System.out.println(Pattern.matches("s[lh]eep", "sleep"));
System.out.println(Pattern.matches("s[lh]eep", "sheep"));
System.out.println(Pattern.matches("s[lh]eep", "aheep"));
System.out.println(Pattern.matches("[cs][lh]eep", "cleep"));
System.out.println(Pattern.matches("01[01697]-", "010-"));
System.out.println(Pattern.matches("01[01697]-", "011-"));
// \는 정규표현식 내부에서도 특수문법으로 활용되기 때문에
// 정규표현식에서 \\가 되도록 자바 문자열에서는 4개를 적어줘야 한다.
System.out.println(Pattern.matches("s[lh\\\\]eep", "s\\eep"));
/*
# [] 내부에서 사용하는 문법들
[abc] : a 또는 b 또는 c를 허용
[a-z] : a부터 z까지 모두 허용
[A-Z] : A부터 Z까지 모두 허용
[a-zA-z] : 모든 알파벳 허용
[a-f&&c-g] : 두 조건을 모두 만족하는 문자만 허용
*/
System.out.println(Pattern.matches("[a-z]at", "cat"));
System.out.println(Pattern.matches("[a-z]at", "Tat"));
System.out.println(Pattern.matches("[a-zA-Z]at", "Cat"));
System.out.println(Pattern.matches("[a-e&&c-y]at", "eat"));
System.out.println(Pattern.matches("[a-e&&c-y]at", "fat"));
/*
# 하나로 여러 문자를 나타내는 것들
. : 모든 문자 허용, [.] 또는 \.은 .만 허용한다는 뜻
\d : 모든 숫자 허용
\D : 숫자를 제외한 모든 것을 허용
\s : 모든 공백 허용 (\t, \n, \r, ' ')
\S : 공백을 제외한 모든 것을 허용
\w : 일반적인 문자들을 허용 ([a-zA-z0-9_]와 같음)
\W : \w을 제외한 모든 것을 허용
*/
System.out.println(Pattern.matches(".at", "bat"));
System.out.println(Pattern.matches("[.]at", ".at")); // true
System.out.println(Pattern.matches("[.]at", "Sat")); // false
System.out.println(Pattern.matches("\\.at", ".at"));
System.out.println(Pattern.matches("\\dat", "9at")); // true
System.out.println(Pattern.matches("\\Dat", "9at")); // false
System.out.println(Pattern.matches("\\d\\d\\s\\d", "12\t4"));
System.out.println(Pattern.matches("\\d\\d\\s\\d", "12\n4"));
System.out.println(Pattern.matches("\\d\\d\\s\\d", "12 4"));
System.out.println(Pattern.matches("\\d\\d\\s\\d", "12\r4"));
/*
# 해당 패턴이 적용될 문자의 개수를 지정하기
※ 정규표현식 내에서 보기좋으라고 띄어쓰기하면 에러남
.{n} : {} 앞의 패턴이 n개 일치해야 한다.
.{n,m} : {} 앞의 패턴이 n개 이상 m개 이하 일치해야 한다.
.{n,} : {} 앞의 패턴이 n개 이상 일치해야 한다.
.? : ? 앞의 패턴이 0번 또는 한 번 나와야 한다.
.+ : + 앞의 패턴이 최소 한 번 이상 나와야 한다.
.* : * 앞의 패턴이 0번 이상 나와야 한다.
*/
System.out.println(Pattern.matches("\\d{4}[.]jpg", "1234.jpg"));
System.out.println(Pattern.matches("a{1,4}[.]jpg", "a.jpg"));
System.out.println(Pattern.matches("a{1,4}[.]jpg", "aa.jpg"));
System.out.println(Pattern.matches("a{1,4}[.]jpg", "aaa.jpg"));
System.out.println(Pattern.matches("a{1,4}[.]jpg", "aaaa.jpg"));
System.out.println(Pattern.matches("a{1,4}[.]jpg", "aaaaa.jpg"));
System.out.println(Pattern.matches("b+[.]jpg", "b.jpg"));
System.out.println(Pattern.matches("b?[.]jpg", "b.jpg"));
System.out.println(Pattern.matches("b*[.]jpg", "bbbbb.jpg"));
// 문법을 소괄호로 묶어서 적용하는 것이 가능
System.out.println("test: " + Pattern.matches("([.]\\w+)?", " "));
// 여러개 중 하나를 선택하게 만들기
System.out.println(Pattern.matches("255|168|123", "255"));
// 연습1: 해당 문자열이 핸드폰 번호인지 검사할 수 있는 정규표현식을 만들어보세요
// (옛날 번호 포함)
// 연습2: 해당 문자열이 이메일인지 검사할 수 있는 정규표현식을 만들어보세요
// 연습3: 해당 문자열이 IP주소(IPv4)인지 검사할 수 있는 정규 표현식을 만들어보세요
// (0.0.0.0 ~ 255.255.255.255)
System.out.println("===============");
System.out.println(Pattern.matches("01[016789]-\\d{3,4}-\\d{4}", "010-124-1234"));
System.out.println(Pattern.matches("[\\w\\d]+@[\\w\\d]+[.][\\w]+([.][\\w]+)?",
"roa@hanmail.net"));
System.out.println(Pattern.matches("((25[0-5]|2[0-4]\\d|1\\d{2}|\\d{2}|\\d)[.]){3}(2[5][0-5]|2[0-4]\\d|1\\d{2}|\\d{2}|\\d)"
, "254.254.254.254"));
System.out.println("===============");
// # Pattern - 전체 문자열이 정규 표현식과 일치하는지 검사한다.
// # Matcher - 전체 문자열을 탐색하면서 정규 표현식과 매치하는 부분을 찾는다.
String fruits = "apple/banana/kiwi/pineapple/mango/kiwi/orange"
+ "/apple/banana/redkiwi/goldkiwi/purplekiwi/watermelon"
+ "/redkiwi+/redkiwi+/redkiwi+/redkiwi+/";
// 1. 전달한 정규 표현식을 컴파일하여 Pattern 인스턴스 생성
Pattern kiwiRegex = Pattern.compile("(\\w*)(kiwi)(\\+?)");
// 2. 생성한 Pattern 인스턴스로 Matcher를 생성 (해당 패턴으로 검사할 문자열을 전달)
Matcher m1 = kiwiRegex.matcher(fruits);
// 3. 반복문을 통해 패턴과 매치되는 위치를 모두 찾을 수 있다.
while (m1.find()) {
System.out.println("이번에 find()로 찾은 것 : " + m1.group(3));
System.out.println("시작 위치 : " + m1.start(3));
System.out.println("끝 위치 : " + m1.end(3));
}
}
}
728x90
반응형
'JAVA > 기본 이론' 카테고리의 다른 글
JAVA | Calender (0) | 2023.04.14 |
---|---|
JAVA | Date (0) | 2023.04.14 |
JAVA | String Builder (0) | 2023.04.10 |
JAVA | String class (0) | 2023.04.10 |
JAVA | Map (0) | 2023.04.10 |