정규 표현식(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\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/~\\+#])?");
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 >
# 어제도 배웠지만, 정규 표현식은 한번 잘 익힌다면, 자바에서만 쓰이는것이 아니기때문에, 문서화작업이나 수많은 문자열에서 내가 원하는 문자열만 골라서 쉽게 찾아낼 수 있다.
'인천일보아카데미 > - 학습일지' 카테고리의 다른 글
[학습일지]JAVA교육일지 44일차 (0) | 2022.06.16 |
---|---|
[학습일지]JAVA교육일지 43일차 (0) | 2022.06.16 |
[학습일지]JAVA교육일지 40일차 (0) | 2022.06.15 |
[학습일지]JAVA교육일지 39일차 (0) | 2022.06.15 |
[학습일지]JAVA교육일지 38일차 (0) | 2022.06.15 |