반응형
정규 표현식
- Regular Expression
- 특정한 규칙을 가진 문자열의 집합
- JDK 1.4부터 제공
검색
- ^ : 문자열 시작부터
- $ : 문자열 종료까지
- . : 줄바꿈을 제외한 임의의 한 문자
- *: 바로 앞에 문자가 없거나 하나 이상 있을 때
- +: 바로 앞에 문자가 하나 이상 있을 때
- [^] : ^ 이후의 괄호안 형식을 제외한 문자
- [] : []안의 형식을 일치하는 문자열
- {} : {} 앞의 문자열의 반복 개수 - ab{2,} : 2개 이상, ab{1,2} : 1부터 2까지
- ( ) : () 안의 내용을 하나의 묶음으로 처리
- | : OR 연산
- [0-9] : 0~9 숫자, [a-z A-Z] : 모든 알파벳, [ㄱ-ㅎ|ㅏ-ㅣ|가-힣] : 모든 한글
- \s : 모든 공백 문자, \S : 공백 문자 제외, \d : 0
9 제외, \w : 모든 알파벳, \S : 모든 알파벳 제외
9, \D : 0
//대상 문자열
String str = "123456789";
//Pattern , Matcher 를 사용한 비교
Pattern p = Pattern.compile("^[0-9]*$");
Matcher m = p.matcher(str);
System.out.println(m.find());
//String 객체의 matchers 사용한 비교
System.out.println(str.matches("^[0-9]*$"));
[출력]
true
true
- 문자열 처음과 끝까지 숫자만 반복되는 문자열이면 true, 아니면 false 반환
- Charater.isDigit(str.charAt(index))로 사용 가능
- 전체 문자열 비교를 위해 ^로 시작하여 $로 끝나야 한다.
- matches() 를 사용하는 것이 비교적 간결
String[] str2 = {"ASDF12" , "123456", "QWERTY", "as45aa", "567jkl"};
String regex = "^[0-9A-Z]{6}$"; //regex 는 regular expression의 줄임말
for (String data : str2) {
System.out.printf("%s \t %b\n", data, data.matches(regex));
}
[출력]
ASDF12 true
123456 true
QWERTY true
as45aa false
567jkl false
- {갯수} 또는 *를 통해 연속 문자임을 지정 해줘야 한다.
String target = "sample@sample.com,test@test.co.kr,example@example.com,school@school.net";
String regex2 = "([\\w]*@[\\w]*.com)"; // "([\\w]*@[\\w]*(.com|.net))" OR 연산도 가능
Pattern pattern2 = Pattern.compile(regex2);
Matcher matcher2 = pattern2.matcher(target);
while (matcher2.find()) {
System.out.println(matcher2.group());
}
[출력]
sample@sample.com
example@example.com
- 자바에서 코드로 \를 정의하기 위해선 2번 사용해야 한다.
- [] 묶음 당 여러 개수 정의를 위해 *를 붙여 준다.
String target2 = "https://docs.oracle.com/en/java/String.html";
String regex3 = "\\w+.html";
Pattern pattern3 = Pattern.compile(regex3);
Matcher matcher3 = pattern3.matcher(target2);
while (matcher3.find()) {
System.out.println(matcher3.group());
}
[출력]
String.html
- 앞의 첫 알파벳만 가져오고 싶은경우 +를 사용하여 구할 수 있다.
치환
String[] str = {"ASDF12" , "123456", "QWERTY", "as45aa", "567jkl"};
String regex = "[^0-9]"; // 숫자를 제외
for (String data : str){
System.out.printf("%s \t %S\n", data, data.replaceAll(regex, ""));
}
- replaceAll 을통해 특정 문자열을 모두 치환 - replace는 문자열만 가능, replaceAll은 정규표현식도가능
String no = "주민 등록 번호 : 010101-1010100 주민 등록 번호 : 020202-2020200";
String regex2 = "[0-9]{6}-[0-9]{7}";
Pattern pattern = Pattern.compile(regex2);
Matcher matcher = pattern.matcher(no);
while (matcher.find()) {
System.out.print(matcher.group() + " -> ");
String newNo = matcher.group().substring(0, 7) + "****" + matcher.group().substring(11);
System.out.println(newNo);
}
- substring을 사용하여 주민번호 일부 마스킹 처리
- substring(index) : index를 시작으로 문자열 끝까지 반환
반응형