제육's 휘발성 코딩
article thumbnail
Published 2021. 10. 11. 23:06
[JAVA] - 정규표현식 regex 🔷 Java/Basic
반응형

정규 표현식

  • 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, \D : 0
    9 제외, \w : 모든 알파벳, \S : 모든 알파벳 제외
//대상 문자열
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를 시작으로 문자열 끝까지 반환
반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^