JAVA | 구분자 여러개일 때 split() 정규식으로 뽑는 방식

728x90

🟦 JAVA | 구분자 여러개일 때, 정규식으로 뽑는 방식

1) split()에 정규 표현식으로 구분자 여러개 담아서 자르기

  • 주의할 점 : 온점(.) , (+)은 정규식에서 특별한 의미를 지니기 때문에, 단순한 문자로 인식시키기 위해서는 \\를 앞에 붙여야 한다.

String str = "a.b,c+d";

String[] tmp = str.split("\\\\.|,|\\\\+"); 
\\\\는 단순 문자열로 인식하라고 붙였고,
| 는 or의 의미이다. 여기서 . 또는 , 또는 + 모두 구분자로 인식하겠다 의미. 

str.split("@|#|%");
정규식에서 '|' 기호는 or 연산을 수행합니다.
'@' 또는 '#' 또는 '%' 기호를 구분자로 하여 문자열을 잘라줍니다.

2) StringTokenizer 클래스 사용

  • 이 클래스는 문자열을 구분자 기준으로 자른다.

⬛ name@domain.탑도메인 형식으로 된 문자열 개수 | 풀이

(1) 소문자 . 소문자 @ 소문자 : 이런 형식이 있을 수도 있다.

(2) 소문자. 소문자 . @소문자. 소문자 : 이런 형식도 있을 수 있다.

🔵풀이 방식

  1. 우선 @ 를 기준으로 자르고 그 크기가 2를 넘어가면 continue;
  2. 크기가 2를 넘어가지 않는다면 tmp[0] 는 name 이 되고 tmp[1] 은 도메인 묶음이 된다.
  3. 도메인 묶음을 다시 판별할 함수를 만든다.

-(1) 그 함수 내부에서는 (.) 을 기준으로 문자를 잘라서 크기 2인 경우에 한해서 처리

-(2) 크기 2인 경우 tmp[0] 은 소문자인지 확인, tmp[1]은 조건에 맞는 com, net, org 중에 하나에 해당하는지 확인하여 맞으면 true 리턴

//오답노트- 구분자로 여러 구분자 자르기 
public class Main {
	//소문자로 된 인지 
	static boolean isName(String name) {
		char[] tmp = name.toCharArray();
		for(int i=0; i<tmp.length; i++) {
			if(!Character.isLowerCase(tmp[i])) { //하나라도 아닌 게 나오면 
				return false; //거짓 
			}
		}
		return true; //다 통과하면 진실 
		
	}
	//뒷 도메인 처리 
	static boolean isDomain(String domain) {
		String[] a = domain.split("\\\\.");// . 을 기준으로 자르고
		if(a.length == 2) { //두개로 나뉘는 경우에 한해서 
			String dm = a[0]; // 얘는 소문자인지 봐야 하고 
			String td = a[1]; // 얘는 해당되는 애인지만 봐야 하고
			
			if(isName(dm) == true) {
				if(td.equals("com") || td.equals("net") || td.equals("arg")) {
					return true;
				}
			}
		}
		return false;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String[] arr = {"abdxdfc.brmde@net", "abc@br.com" , "abdx.dfc@brm@e.net", "abdxdfc@brm@com.net","woeiq@dalge.com", "abdxdfc.brmde@net"};
		int answer =0;
		
		for(String x : arr) {
			String[] tmp = x.split("@");//일단 골뱅이 기준으로 잘라
			if(tmp.length == 2) { //이 경우에 한해서만 
				String name = tmp[0]; //앞부분 
				String domain = tmp[1];//얘를 따로 처리
				
				if(isName(name) == true && isDomain(domain) == true) {
					answer++;
				}
				
			}else continue;//그 외는 제낌			
		}
		//정답 출력 
		System.out.println(answer);
	}
}
728x90