h-i-s-t-o-r-y

[Java] 정규표현식 - String.matches(regex) / pattern, matcher 본문

Java

[Java] 정규표현식 - String.matches(regex) / pattern, matcher

H' 2021. 7. 13. 11:46

> String 클래스의 matches(String regex) 메서드

문자열.matches(regex) 의 형식으로 사용하며, 해당 문자열이 주어진 정규식(regex)과 일치하는지의 여부를 boolean형으로 반환한다.

https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

 

Pattern (Java Platform SE 8 )

Enables canonical equivalence. When this flag is specified then two characters will be considered to match if, and only if, their full canonical decompositions match. The expression "a\u030A", for example, will match the string "\u00E5" when this flag is s

docs.oracle.com


> 이름, 국어, 영어, 수학을 입력받아서 0~100 사이의 정수를 입력했는지 유효성 검사를 한 뒤 총점, 평균 출력하기

package days06;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

public class Ex03_02 {

	public static void main(String[] args) throws IOException {
    
		int kor, eng, mat, tot;
		double avg;
		
		kor = getScore("국어");
		eng = getScore("영어");
		mat = getScore("수학");
		
		tot = kor + eng + mat;
		avg = (double)tot / 3;

		System.out.println(kor);
		System.out.println(eng);
		System.out.println(mat);
		System.out.println(tot);
		System.out.println(avg);

	} //main

	private static int getScore(String subjectName) {
		Scanner scanner = new Scanner(System.in);
		// 유효성 검사 한 후에 0<= 정수 <= 100
		
		// 100이 오던지 / [1-9]는 와도되고 안와도 되고 / [0-9]필수
		String regex ="100|[1-9]?[0-9]";
		String data;
		boolean flag = false;
		
		do {
			if (flag) System.out.print("> 입력 잘못해서 다시 입력 : ");
			System.out.printf("> %s 점수 입력하세요 ? ", subjectName);
			data = scanner.next();
			
			// 입력값 문자열.matches(정규표현식)
			// 정규표현식에 일치하지 않으면 반복작업
		} while (flag = !data.matches(regex));
		// while (data.matches(regex) == false);
		
		return Integer.parseInt(data);
		
	}//fct

} //class

> 우편번호를 000-000 또는 00000 형태로 올바르게 입력했는지 확인 후 출력하기

package days06;

import java.util.Scanner;

public class Ex03_03 {

	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		System.out.printf("> 우편번호 입력 ? ");
		String  zipCode = scanner.next();
		
		// 우편번호 000-000 or 00000
//		String regex = "[0-9]{3}-[0-9]{3}|[0-9]{5}";
		String regex = "\\d{3}-\\d{3}|\\d{5}";
		
		if(zipCode.matches(regex)) {
			System.out.println(zipCode);
		} else {
			System.out.println("올바르지 않은 우편번호 입니다.");	
		}

	} //main

} //class

> p.506 예제 9-32

package days22;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Ex11 {

	public static void main(String[] args) {
		// p.506 예제 9-32 [정규표현식]
		// * 0개~무한개 
		
		
		String[] data = {"bat", "baby", "bonus", "c", "cA"
						, "ca", "co", "c.", "c0", "c#", "car"
						, "combat", "count", "date", "disc"};
		
		String[] pattern = {".*", "c[a-z]*", "c[a-z]", "c[a-zA-Z]"
						, "c[a-zA-Z0-9]", "c.", "c.*", "c\\."
						, "c\\w", "c\\d", "c.*t", "[b|c].*"
						, ".*a.*", ".*a.+", "[b|c].{2}"};
		
		for (int x = 0; x < pattern.length; x++) {
			Pattern p = Pattern.compile(pattern[x]);
			System.out.print("Pattern : " + pattern[x] + " 결과 : ");
			for (int i = 0; i < data.length; i++) {
				Matcher m = p.matcher(data[i]);
				if (m.matches()) {
					System.out.print(data[i] + ",");
				}
			}
			System.out.println();
		}
				
		
		
	}

}

> p.508 예제 9-33

package days22;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Ex12 {

	public static void main(String[] args) {
		// p.508 예제 9-33
		// 전화번호 문자열
		String source  = "HP:011-1111-1111, HOME:02-999-9999 ";
		// [0다음 숫자(0-9)가 1또는2개옴 - 숫자가 3또는4개옴 - 숫자가 4개옴]
		String pattern = "(0\\d{1,2})-(\\d{3,4})-(\\d{4})";
		// (group) 괄호로 묶은 것이 group이 됨
		// 정규식의 일부를 괄호로 나누어 묶어서 그룹화 할 수 있다.
		// 그룹화된 부분은 m.group(int i)를 이용해서 나누어서 얻을 수 있다.

		Pattern p = Pattern.compile(pattern);
		Matcher m = p.matcher(source);

		int i=0;
		
		//find() 일치하는 **부분**이 있으면 true
		//한번 호출될때마다 다음 일치하는 목록으로 이동
		
		System.out.println(m.find());		//true
		System.out.println(m.group());		//(011)-(1111)-(1111)
		System.out.println(m.groupCount());	//그룹개수 3
		System.out.println(m.group(1));		//그룹1 (011)
		System.out.println(m.group(2));		//그룹2 (1111)
		System.out.println(m.group(3));		//그룹3 (1111)
		
		System.out.println(m.find());		//true
		System.out.println(m.group());		//(02)-(999)-(9999)
		System.out.println(m.groupCount());	//그룹개수 3
		System.out.println(m.group(1));		//그룹1 (02)
		System.out.println(m.group(2));		//그룹2 (999)
		System.out.println(m.group(3));		//그룹3 (9999)
		
//		System.out.println(m.find());	//false 매치되는거 이제 없음
//		System.out.println(m.group());	//error 없어서 오류
		

//		while(m.find()) {
//			System.out.println( ++i + ": " + m.group() + " -> "+ m.group(1) +", "+ m.group(2)+", "+ m.group(3));		
//		}
		
		
	}

}

> p.509 예제 9-34

package days22;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Ex13 {

	public static void main(String[] args) {
		// p.509 예제 9-34
		String source  = "A broken hand works, but not a broken heart.";
		String pattern = "broken";

		StringBuffer sb = new StringBuffer();

		Pattern p = Pattern.compile(pattern);
		Matcher m = p.matcher(source);
		System.out.println("source:"+source);

		int i=0;

		while(m.find()) {
			System.out.println(++i + "번째 매칭:" + m.start() + "~"+ m.end());
			
            // 패턴 매치되는 문자열 "broken"을 "drunken"으로 치환하여 sb에 저장한다.
			m.appendReplacement(sb, "drunken");
			// m.appendReplacement(StringBuffer sb, String replacement);
			// Matcher 객체가 가리키는 일치하는 부분[까지]를 저장하고
			// 일치하는 부분은 "drunken"으로 대체
			// 1) A drunken
			// 2) A drunken hand works, but not a drunken
		}
		
		m.appendTail(sb);
		// m.appendTail(StringBuffer sb);
		// appendReplacement 메서드를 하나이상 호출한후에 호출해야함
		// 나머지 문자열이 붙어서 저장됨
		// -> A broken hand works, but not a broken heart.
		System.out.println("Replacement count : " + i);		//교환 개수
		System.out.println("result:"+sb.toString());
	}

}

'Java' 카테고리의 다른 글

[Java] 재귀함수(Recursive Function)  (0) 2021.07.16
[Java] switch() 예제  (0) 2021.07.16
[Java] 함수(function) / 오버로딩(overloading)  (0) 2021.07.13
[Java] 배열(Array)  (0) 2021.07.13
[Java] System.in.read()  (0) 2021.07.12
Comments