본문 바로가기
인천일보아카데미/- 학습일지

[학습일지]JAVA교육일지 41일차

by w1z 2022. 6. 15.

정규 표현식(Regular Expression)


정규 표현식(Regular Expression)

- 어제는 정규 표현식에 대해 알아보았고, 이클립스에서 제공하는 Find/Replace (Ctrl+F) 기능을 예제로 알아보았다.

- 오늘은 자바에서 정규 표현식을 지원하는 일부 메소드를 알아보자.

 

[ replaceAll(), split() 메소드를 이용한 정규 표현식 ]

String txt = "안녕하세요. 홍길동입니다. 제 전화번호는 010-1234-5678입니다. 그리고 집 전화는 02-123-4567입니다.";
System.out.println(txt.replaceAll("[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}", "XXX-XXXX-XXXX"));
//--------------> 0~9까지숫자 중에서 2~3자리, 3~4자리, 4자리를 XXX로 바꾼다.

String name = "홍길동,,아무개.하하하,호호호,후후후";
String[] result = name("[,\\.]{1,2}"); 
//---------------> 문자열 구분을 콤마(,)로 하는데 콤마가 한번 더 찍히거나 점(.)이 찍힐경우를 대비
//---------------> 콤마, 점을 1~2자리까지 허용한다.

for (int i=0; i<result.length; i++) {
    System.out.printf("result[%d] = %s\n", i, result[i]);
}


//OUTPUT
안녕하세요. 홍길동입니다. 제 전화번호는 XXX-XXXX-XXXX입니다. 그리고 집 전화는 XXX-XXXX-XXXX입니다.
result[0] = 홍길동
result[1] = 아무개
result[2] = 하하하
result[3] = 호호호
result[4] = 후후후

 

[ Pattern & Matcher 클래스를 이용한 정규 표현식 1]

String txt = "안녕하세요. 홍길동입니다. 제 전화번호는 010-1234-5678입니다. 그리고 집 전화는 02-123-4567입니다.";

//정규식 객체 생성 - Pattern > 정규식 입력
Pattern p = Pattern.compile("\\d{2,3}-\\d{3,4}-\\d{4}");

//검색 - Matcher > boolean 반환
//find() : boolean 반환
//group() : 검색된 내용 출력
//find(), group()메소드는 iter의 hasNext(), next()와 비슷한 느낌이다.
Matcher m = p.matcher(txt);

if(m.find()) {
	System.out.println("검색 완료!!");
	System.out.println(m.group());
} else {
	System.out.println("검색 불가");
}

//금지어설정
txt = "글을 쓰고있습니다.바보";

p = Pattern.compile("(바보|멍청이)");
m = p.matcher(txt);

if (m.find()) {
	System.out.println("금지어 사용!!");
	System.out.println(m.group());
} else {
	System.out.println("사용 가능!!");
}


//OUTPUT
검색 완료!!
010-1234-5678
금지어 사용!!
바보

 

[ Pattern & Matcher 클래스를 이용한 정규 표현식 2]

String txt = "안녕하세요. 제 몸무게는 70kg, 키는 180cm, 나이는 27살이다!";
		
Pattern p = Pattern.compile("\\d{1,}"); //1 ~ 모든숫자 자리
Matcher m = p.matcher(txt);
		
while (m.find()) {                   //m.find ?? --> iter.hasNext() 같은 느낌..
    System.out.println(m.group());   //m.group ?? --> iter.next() 같은 느낌..
}


//OUTPUT
70
180
27

 

[ Pattern & Matcher 클래스를 이용한 정규 표현식 3]

- 임의로 naver 홈페이지 메인 화면에서 페이지 소스 보기로 3000line을 복사해왔다.

- 여기서 모든 URL을 구하기

try {
    BufferedReader reader = new BufferedReader(new FileReader("dat\\naver.txt"));
	
    String wholeText = "";
    String line = "";
	
    while ((line = reader.readLine()) != null) {
         wholeText += line + "\r\n";
    }
    reader.close();
	
    //test에 임의로 작성한 모든 URL를 수집
    Pattern p = Pattern.compile("(http|ftp|https):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&amp;:/~\\+#]*[\\w\\-\\@?^=%&amp;/~\\+#])?");
    Matcher m = p.matcher(wholeText);
	
    while (m.find()) {
        System.out.println(m.group());
    }

} catch (Exception e) {
    System.out.println(e);
}

 

[ Pattern & Matcher 클래스를 이용한 정규 표현식 4]

- 나이를 입력받아 유효성 검사하기

Scanner scan = new Scanner(System.in);
		
System.out.print("나이 입력: ");
String input = scan.nextLine();
		
String regex = "^[0-9]{1,3}$"; 
// ^: 숫자(0~9)부터 시작해라~ 
// %: 1자리~3자리 숫자로 끝나라~

Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
		
if (m.find())  System.out.println("올바른 나이입니다.");
else System.out.println("숫자로 다시 작성하세요.");

 

[ Pattern & Matcher 클래스를 이용한 정규 표현식 5]

- 이메일을 입력받아 유효성 검사하기

Scanner scan = new Scanner(System.in);
		
System.out.print("아이디 입력: ");
String input = scan.nextLine();
		
//String regex = "[A-Za-z_][A-Za-z0-9_]{3,11}";
String regex = "^[A-Za-z_]\\w{3,11}$"; //위 아래 똑같음. 위에 코드를 간략화 한것이 밑에 코드
		
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
		
if (m.find()) System.out.println("통과");
else System.out.println("실패");

 

[ 정규 표현식을 이용하여 유효성 체크 ]

- Java에서 유효성 체크(영문자, 대소문자, 숫자, 숫자길이)를 직접 코드를 구현하면 20~30 line 정도의 코드를 구현해야 한다.

- 하지만 정규 표현식을 이용한다면 10 line 이내로 간결하게 유효성 체크를 할 수 있다. 


MEMO >

# 어제도 배웠지만, 정규 표현식은 한번 잘 익힌다면, 자바에서만 쓰이는것이 아니기때문에, 문서화작업이나 수많은 문자열에서 내가 원하는 문자열만 골라서 쉽게 찾아낼 수 있다.