안녕하세요. 제임스 입니다. 


이번 포스팅에서는 정규표현식을 이용한 split 함수를 이용 하는 방법에 대해 알아 보겠습니다. 



Java split 함수 관련 내용은 아래 포스팅을 참조 하세요.

2017/11/16 - [Java] - [ 자바 코딩 ] Java split() 함수로 문자열 자르기



■ 정규표현식으로 문자열 자르기 (split 함수 사용)



▶ 예제 1


1
String regExp = "\\Q|\\E";
cs


정규표현식을 위와 같이 작성하여 문자열 자르기를 위한 토큰 값으로 선언 했습니다. 


정규표현식에서 \Q 와 \E 는 한셋트로 사용되는 표현식으로 \Q 와 \E 사이의 문자를 의미 합니다. 

즉, 위 표현식의 경우 일반적으로 or 를 의미하는 " | " 를 토큰 값으로 선언 한 것입니다. 


사용 방법은 아래와 같습니다. 


1
2
3
4
5
6
String strInput = "james|tistory|regular|expression";
String[] retStr = strInput.split(regExp);
        
for(int i = 0; i < retStr.length; i++){
    System.out.println("retStr["+i+"] = "+retStr[i]);
}
cs


strInput 값에 " james | tistory | regular | expression " 이라는 변수값을 선언 했습니다. 

Sting 을 split 했을때 배열로 리턴 됩니다. (위 Java split() 함수 포스팅 참조)


결과 값을 확인하기 위해 for loop 를 돌려서 결과 값을 찍어 봤습니다. 


결과는 아래와 같습니다. 


Results

retStr[0] = james

retStr[1] = tistory

retStr[2] = regular

retStr[3] = expression




▶ 예제 2


1
String regExp = "\\s*[a-zA-Z]+";
cs


정규 표현식을 위와 같이 작성 해봤습니다. 

위 표현식은 공백문자가 0회 이상, 영문 대소문자 1회 이상인 것을 의미하는 표현식입니다. 


즉, 공백문자나 영문자가 오면 이것을 토큰으로 사용 하겠다는 의미로 작성한 표현식입니다. 


실제 예문을 보시겠습니다. 


1
2
3
4
5
6
7
8
String strTest = "a + b - c * d / e < f > g >= h <= i == j";
String[] retStr = strTest.split(regExp);
        
for (String out : retStr) {
    if (!"".equals(out)) {
        System.out.print(out);
    }
}
cs



strTest 라는 변수에 영문자, 공백문자 그리고 기타 비영문자들이 자리하고 있습니다. 

의도 한대로 표현식이 적용 된다면 공백문자 외 +, -, * 등등의 값들이 남아 있어야 합니다. 


위 코드 실행 결과는 아래와 같습니다. 


Results 

 + - * / < > >= <= ==


위 결과 값에서   는 공백문자를 의미 합니다. 


표현식에서는 조건을 공백문자(0회 이상) + 영문자(1회 이상 : 즉, 필수) 형태로 설정했기 때문에 결과가 위와 같이 나왔습니다. 


a + b - c * d / e < f > g >= h <= i == j


위 문자열에 마우스 커서를 가져가 보시면 좀더 편하게 이해 하실 수 있을 것 같습니다.

첫번째 a 를 제외 나머지 문자열들은 앞에 공백문자 + 영문자 형태로 되어 있습니다. 

결과적으로 나머지 영문자 뒤에 따라오는 공백문자 + 비영문문자의 조함이 남은 결과 값으로 리턴 되었습니다. 



최대한 쉽게 풀어 쓴다고 했는데 오히려 더 복잡해 진것 같은 느낌적인 느낌이 듭니다.


혹, 이해하기 어려운 부분이 있으신 경우 글 남겨 주시면 도움 드릴 수 있도록 하겠습니다. 





 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


이번 포스팅에서는 정규표현식을 이용하여 특정 숫자의 범위를 지정하는 방법에 대해 알아 보겠습니다. 

이번 글을 사실 앞서 포스팅한 표현식중에 사용된 적이 있는 방식인데요. 

간단히 설명하듯이 넘어갔기에 이번에 조금 더 정리 하고자 합니다. 



■ 정규표현식으로 숫자 범위 지정 패턴 만들기


로또 많이들 관심을 가지고 있을 것 같습니다. 

로또 번호는 1 ~ 45 까지의 값만 선택 가능합니다. 


이 로또 번호의 범위 1 ~ 45 까지의 숫자만 입력 가능한 패턴을 만들어 보겠습니다. 




숫자를 허용 하는 표현식은 이제 다들 아시리라 생각합니다. 

간단하죠? 


^[0-9]$


위와 같이 작성하면 어떤 숫자든 허용 한다는 의미 입니다. 하지만 딱 한자리 숫자만 체크 합니다. 


만약 입력 값이 한자리 숫자이며 0 ~ 9 사이 값이라면 위 표현식으로도 충분 하지만 지금 만들고자 하는 패턴은 한자리 숫자가 아닌 두자리 숫자로 최대 45 까지만 허용 해야 하는 조건입니다. 


지금부터 하나씩 조건을 맞춰 가보겠습니다.



^[1-9]{1}$

1 ~ 9 까지 한자리 숫를 허용하는 표현식 하나를 완성 시켰습니다. 



^[1-9]{1}$

or 를 의미하는 " | " 값을 이용하여 10 이상 ~ 45 이하를 포함하는 식을 추가 할 표현식을 연결할 준비를 합니다. 



^[1-9]{1}$|^[1-3]{1}[0-9]{1}$

첫번째 자리는 1 ~ 3 까지만 허용하고 두번째 자리는 0 ~ 9 까지 허용하는 표현식을 이용 했습니다. 

즉, 10 ~ 39 까지의 값을 허용 할 수 있는 표현식입니다. 



^[0-9]{1}$|^[1-3]{1}[0-9]{1}$|

or 를 의미하는 " | " 값을 이용하여 남은 40 ~ 45 사이의 값을 포함하는 식을 추가 합니다. 



^[0-9]{1}$|^[1-3]{1}[0-9]{1}$|^4{1}[0-5]{1}$

첫번째 자리는 4만 허용하고 두번째 자리는 0 ~ 5 까지의 숫자를 허용하는 표현식을 추가 했습니다. 

이는 40 ~ 45 까지의 값을 허용 하는 표현식입니다. 



여기까지 이해가 되셨나요? 




이제 샘플 코드를 보시 겠습니다. 


1
String regExp = "^[1-9]{1}$|^[1-3]{1}[0-9]{1}$|^4{1}[0-5]{1}$";
cs


위에서 작성한 최종 표현식을 regExp 로 선언 했습니다. 



1
2
3
4
5
6
7
8
9
String lottoNum1 = "8";
String lottoNum2 = "25";
String lottoNum3 = "45";
String lottoNum4 = "56";
 
System.out.println("lottoNum1 테스트 결과 ==> "+lottoNum1.matches(regExp));
System.out.println("lottoNum2 테스트 결과 ==> "+lottoNum2.matches(regExp));
System.out.println("lottoNum3 테스트 결과 ==> "+lottoNum3.matches(regExp));
System.out.println("lottoNum4 테스트 결과 ==> "+lottoNum4.matches(regExp));
cs


위와 같이 8, 25, 45, 56 등 네가지 값을 작성한 표현식을 이용하여 Validation check 해보겠습니다. 


실행 결과는 아래와 같습니다. 


Results 

lottoNum1 테스트 결과 ==> true

lottoNum2 테스트 결과 ==> true

lottoNum3 테스트 결과 ==> true

lottoNum4 테스트 결과 ==> false



직접 테스트 해보시면 아시겠지만 1 ~ 45 까지의 모든 값을 허용 하고 그 외의 값들은 허용하지 않습니다. 

생각보다 간단하죠? ^^


위와 같은 방법으로 원하는 표현식을 만들 수 있습니다. 




만약 0 ~ 9 사이의 숫자중 5, 6 은 허용하지 않는 다는 표현식을 만든다면 어떻게 하면 될까요? 


^[0-47-9]{1}$


0-4: 0 ~ 4 까지 허용 

7-9: 7 ~ 9 까지 허용

주의 할 점은 4와 7 이 붙어 있다고 하여 47을 의미 하는 것이 아니라 각각의 범위 지정 끝 숫자와 시작 숫자라는 겁니다.



1
String regExp = "^[0-47-9]{1}$";
cs


위 표현식을 이용하여 테스트를 해보겠습니다. 



1
2
3
4
5
String numTest1 = "4";
String numTest2 = "6";
 
System.out.println("numTest1 테스트 결과 ==> "+numTest1.matches(regExp));
System.out.println("numTest2 테스트 결과 ==> "+numTest2.matches(regExp));
cs



실행 결과는 아래와 같습니다. 


Results

numTest1 테스트 결과 ==> true

numTest2 테스트 결과 ==> false




이번 포스팅 내용을 참고 하시면 대부분의 숫자 범위 지정은 무리 없이 하실 수 있을 거라 생각합니다. 




 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D


블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


이번 포스팅에서는 정규표현식을 이용한 주민등록번호 패턴을 만들어 보겠습니다. 



■ 정규표현식으로 주민등록번호 패턴 만들기


주민등록번호 구성은 아래와 같습니다. 


예) 123456 - 1234567


◎ 첫 6자리

12 ▶ 출생년도 마지막 두자리

34 ▶ 출생 월

56 ▶ 출생 일



◎ 마지막 7자리

1 ▶ 성별 (1: 남자, 2: 여자, 3: 2000년 이후 출생자 남자, 4: 2000년 이후 출생자 여자)

2345 ▶ 지역코드

6 ▶ 출생신고지 기준 접수 순번

7 ▶ 검증번호 (앞 12 자리 숫자를 특정 공식에 대입 시 딱 하나의 숫자만 나올 수 있음)



주민등록 번호는 위와 같은 구성으로 만들어 질 수 있습니다. 


이번 포스팅에서는 각각의 모든 자리의 의미를 파악하고 작업 하는 것이 아니라 간편하게 입력 받을 수 있도록 만들어 보겠습니다. 디테일링은 각자 해보시기 바라겠습니다. (혹, 어렵다면 댓글로 남겨 주세요 ㅎㅎ)


이제 패턴 만들기를 시작해 보겠습니다. 




■ 앞 6자리 패턴 만들기


▶ 출생년도 


^\\d{2}

또는 

^[0-9]{2}


위 두가지 표현식 모두 동일한 의미 입니다. 0 ~ 9 사이 두자릿수 숫자 허용



▶ 출생 월 


^\\d{2}(0[1-9]|1[0-2])


앞자리가 0일때 뒷자리는 1 ~ 9 까지 허용. 즉, 01 ~ 09 월 까지 범위 설정

또는을 의미하는 " | " 값을 이용하여 앞자리가 1일때 뒤자리가 0 ~ 2 까지 허용 되는 값을 설정하여 전체 01월 부터 12월 까지 허용 하는 코드 추가 



▶ 출생 일 


^\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|[3][01])


앞자리가 0 ~ 2 까지 허용 될때 두번째 자리는 0 ~ 9 까지 설정하여 01 ~ 09 일까지 설정

앞자리가 1 또는 2 일때는 뒷자리를 0 ~ 9 까지 모두 허용하는 것으로 설정하여 10 ~ 29 까지 허용

앞자리가 3 일때 뒷자리는 0 또는 1만 허용 하는 것으로 설정하여 30, 31 두 숫자까지 최종 허용 하는 것으로 정의 했습니다. 


결국 01 ~ 31 까지 허용 범위가 지정 되었습니다. 




■ 뒤 7자리 패턴 만들기


▶ 성별


[1-4]

첫 자리 수를 1 ~ 4 사이로 지정 했습니다. 



▶ 나머지 6자리 숫자


[1-4][0-9]{6}

성별을 제외한 나머지 6자리는 0 ~ 9 까지 모두 허용 하며 자릿수는 6자리로 지정 했습니다. 




이제 앞뒤 패턴을 합쳐보겠습니다. 


^\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|[3][01])[1-4][0-9]{6}


뭔가 좀 아쉽죠? 일반적으로 주민등록번호 쓸때 앞 6자리 와 뒤 7자리 사이에 " - " 를 사용하는데요. 이녀석을 한번 추가해 보겠습니다. 




▶ 구분자 ( - ) 추가 


^\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|[3][01])\\-[1-4][0-9]{6}$


앞 6자리와 뒤 7자리 숫자를 구분하기 위한 구분자로 ( - ) 를 추가 했습니다. 




이제 이 값을 한번 테스트 해보겠습니다. 


1
String regExp = "^\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|[3][01])\\-[1-4][0-9]{6}$";
cs


위와 같이 표현식을 선언 했습니다. 

앞서 작성한 주민번호 표현식입니다. 


이제 테스트 코드를 한번 보겠습니다. 


1
2
String ssn1 = "001225-4321126";
System.out.println("주민번호 1 테스트 결과 ==> " + ssn1.matches(regExp));
cs


ssn1 이라는 값이 준비한 표현식에 맞습니다. 

위 코드를 실행 하면 결과는 어떻게 나올까요? 


Results

주민번호 1 테스트 결과 ==> true



1
2
String ssn2 = "980013-1618960";
System.out.println("주민번호 2 테스트 결과 ==> " + ssn2.matches(regExp));
cs


ssn2 라는 값을 잘 보시면 월 부분이 00 으로 입력 되어 있습니다. 잘못 입력 된 값입니다. 


당연하게도 위 코드를 실행 시키면 아래와 같은 결과 값이 나옵니다. 


Results

주민번호 2 테스트 결과 ==> false



1
2
String ssn3 = "950627-7715446";
System.out.println("주민번호 3 테스트 결과 ==> " + ssn3.matches(regExp));
cs


ssn3 이라는 값의 두번째 첫 숫자가 7로 들어 왔습니다. 허용하고 있는 값은 0 ~ 4 까지 입니다. 

어떤 값이 나올지는 예상이 되시죠? 


Results

주민번호 2 테스트 결과 ==> false



사실 이 표현식도 완벽한 표현식은 아닙니다. 


예를 들어 2001년 5월 16일 생의 뒤 7자리 첫번째 숫자는 3 또는 4만 와야 하는데요.

이런 경우의 수 까지 모두 추가를 하려면 표현식이 많이 길어 지겠죠? 


하지만 지금까지 포스팅한 정규표현식 정리 내용을 보신 분들은 어쩌면!!! 당연하게도??? ㅎㅎ;; 잘 하실 수 있을꺼라 생각 됩니다. 


혹, 도전 해보시고자 하시는데 잘 안되시는 분들은 문의 남겨 주시면 도와 드리겠습니다. 



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


이번 포스팅에서는 자바 정규표현식을 이용하여 IP 주소 패턴을 만들어 보겠습니다. 

IP 주소 패턴은 앞서 작성한 포스팅을 보셨다면 아마 간단하게 만드실 수 있을 것이라 생각 됩니다. 


지금부터 시작해 보겠습니다. 



■ 정규표현식으로 IP 주소 패턴 만들기



IP 주소는 다음과 같은 형식을 취하고 있습니다. 


xxx . xxx . xxx . xxx


이는 우리가 일반적으로 많이 사용하고 있는 IP Version 4 (IPv4) 주소 체계입니다. 


각 옥텟의 xxx 값은 0 ~ 255 까지의 숫자가 올 수 있습니다. 

즉, 0.0.0.0 부터 255.255.255.25 까지의 주소가 가능합니다. 



첫번째 옥텟을 지정해 보겠습니다. 


각각의 자리에 따라 맥스 값이 다릅니다. 그리고 경우에 따라 서로 다른 값이 와야 하는 경우도 있습니다. 

예를 들면 첫자리는 0 ~ 2 까지만 올 수 있으며, 첫자리가 2일 경우 두번째 자리는 5를 넘을 수 없고, 첫자리가 1일 경우 두번째 자리는 제한이 없습니다. 


그렇기 때문에 각각의 경우의 수를 생각하고 작성해야 합니다. 



[01]?\\d?\\d

첫번째 자리는 0 또는 1만 허용하고 0 또는 1이 존재 하거나 존재하지 않아도 됩니다. 

두번째 자리는 숫자를 허용하며 값이 존재하거나 하지 않아도 됩니다. 

참고로 \d 라는 값은 [0-9] 와 동일 합니다. 

세번째 자리는 숫자를 허용하며 무조건 존재 해야 합니다. 


위 표현식으로 처리 할 수 있는 값의 범위는 0 ~ 199 까지 입니다. 


이제 남은 200 ~ 255 까지의 숫자를 처리 하면 되겠죠? 



2[0-4]\\d

첫번째 자리는 2 로 고정했습니다. 

두번째 자리는 0 ~ 4 까지의 값만 허용 합니다. 

세번째 자리는 0 ~ 9 까지의 값을 모두 허용 합니다. 


위 두번째 표현식은 200 ~ 249 까지의 값을 표현 합니다. 


이제 남은 값은 250 ~ 255 까지 입니다. 



25[0-5]

첫번째 자리는 2로 고정

두번째 자리는 5로 고정 했습니다. 

세번째 자리만 0 ~ 5 까지의 값을 허용 했습니다. 


이렇게 해서 남은 200 ~ 255 까지의 값을 커버 했습니다. 



이제 각각의 표현식을 합쳐 보겠습니다. 



[01]?\\d?\\d|2[0-4]\\d|25[0-5]

각각의 표현식을 or 를 뜻하는 " | " 기호를 이용하여 나열 했습니다. 


([01]?\\d?\\d|2[0-4]\\d|25[0-5])

여기에 ( ) 를 이용하여 감싸서 하나의 문장으로 지정 했습니다. 



여기까지가 하나의 옥텟을 정의 한 표현식입니다. 



^([01]?\\d?\\d|2[0-4]\\d|25[0-5])\\.([01]?\\d?\\d|2[0-4]\\d|25[0-5])\\.([01]?\\d?\\d|2[0-4]\\d|25[0-5])\\.([01]?\\d?\\d|2[0-4]\\d|25[0-5])$

이 표현식을 네번 나열하고 IP 주소를 표현할때 사용하는 마침표 ( . )를 이용하여 표현식을 수정했습니다.

그리고 마지막으로 표현식의 시작과 끝을 알리는 ^ 과 $ 를 추가 했습니다. 




위 표현식을 이용한 샘플 코드를 보겠습니다. 


1
2
3
4
String regExp = "^([01]?\\d?\\d|2[0-4]\\d|25[0-5])\\."
                + "([01]?\\d?\\d|2[0-4]\\d|25[0-5])\\."
                + "([01]?\\d?\\d|2[0-4]\\d|25[0-5])\\."
                + "([01]?\\d?\\d|2[0-4]\\d|25[0-5])$";
cs


위에서 정의한 값을 적용 했습니다. 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
String ipNum1 = "127.0.0.1";
System.out.println("IP 주소 1 테스트 결과 ==> " + ipNum1.matches(regExp));
        
String ipNum2 = "0.0.0.0";
System.out.println("IP 주소 2 테스트 결과 ==> " + ipNum2.matches(regExp));
        
String ipNum3 = "255.255.255.255";
System.out.println("IP 주소 3 테스트 결과 ==> " + ipNum3.matches(regExp));
        
String ipNum4 = "0-0-0-0";
System.out.println("IP 주소 4 테스트 결과 ==> " + ipNum4.matches(regExp));
        
String ipNum5 = "256.0.0.1";
System.out.println("IP 주소 5 테스트 결과 ==> " + ipNum5.matches(regExp));
cs


ipNum1, ipNum2 및 ipNum3 은 정상 범위의 IP 주소 값입니다. 

하지만 네번째는 허용하지 않는 문자값이 들어 갔습니다. 

마지막은 주소 범위가 255를 벗어나 256이 입력 되어 있습니다. 


위 코드 실행 결과는 아래와 같습니다. 


Results


IP 주소 1 테스트 결과 ==> true

IP 주소 2 테스트 결과 ==> true

IP 주소 3 테스트 결과 ==> true

IP 주소 4 테스트 결과 ==> false

IP 주소 5 테스트 결과 ==> false



위 표현식은 IP Version 4 (IPv4) 를 기준으로 작성 했습니다. 

하지만 IP Version 6 (IPv6) 도 간단하겠죠? 

그냥 처음에 작성한 코드를 두번만 더 붙여 주면 끝납니다 ^^



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D


블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


이번 포스팅에서는 자바 정규표현식을 이용하여 휴대폰 번호 패턴을 만들어 보겠습니다. 

휴대폰 번호 패턴은 생각보다 많이 사용하는 형식이니 기본적인 셋팅과 커스터마이징을 통한 패턴을 저장해 두시면 좋을 것 같습니다. 


그럼 시작해 보겠습니다. 




■ 정규표현식으로 휴대폰 번호 패턴 만들기


국내 기준으로 휴대폰 번호 패턴을 만들어 보겠습니다. 


일반적으로 휴대폰 번호는 세자리로 나뉘어져 있습니다.


첫 세자리는 아래와 같은 번호들이 올수 있습니다. 


010

011

016

017

018

019


물론 지금에서야 대부분 010 을 사용하고 있지만 아직도 구 번호 체계를 그대로 사용하고 계신분들이 계시니 무시 할 수는 없습니다. 


두번째 자리는 3 ~ 4자리의 임의의 숫자가 오면 됩니다. 


세번째 자리는 일반적으로 4자리로 지정을 많이 하고 있으니 그대로 따르는 것으로 하겠습니다. 


자릿수 사이에 아무 표기도 사용하지 않거나 " - " 로 구분 또는 " . " 로 구분 하는 것을 허용 하도록 하겠습니다. 


01012341234

010-1234-1234

010.1234.1234


위 세가지 패턴 모두 허용 하는 것으로 작성 해보겠습니다. 



▶ 첫 세자리 


^01

정규표현식 패턴의 시작을 의미 하는 ^ 를 시작으로 01 을 추가했습니다. 

문자열의 시작을 01 이라는 것을 의미합니다. 


^01(?:0|1|[6-9])

01 다음에 오는 값으로 0, 1 또는 6 ~ 9 사이 값으로 지정을 했습니다. 



▶ 두번째 자리


^01(?:0|1|[6-9])(\\d{3}|\\d{4})

3자리 또는 4자리의 숫자를 허용 하는 것으로 지정 합니다. 



▶ 세번째 자리


^01(?:0|1|[6-9])(\\d{3}|\\d{4})(\\d{4})$

마지막은 4자리 숫자로 지정 했습니다. 
그리고 표현식의 종료를 알리는 $ 로 마무리 했습니다. 



▶ 구분값 추가


휴대폰 번호를 입력 시 " - " 를 추가 하거나 국내에서는 많이 사용하지 않지만 " . " 를 추가 하는 경우가 있습니다. 

아무런 표기를 하지 않거나 " - " 또는 " . " 를 허용 하는 코드를 추가 하겠습니다. 


^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$


[.-]?

위 값은 " . " 또는 " - " 값이 없거나 단 한개만 존재 하는 것을 의미 합니다. 



제가 작성한 정규표현식 최종 모습은 아래와 같습니다. 

^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$




1
String regExp = "^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$";
cs


위와 같이 자바 코드로 작성 후 위 표현식을 테스트 해보겠습니다. 



1
2
String mobNum1 = "01012345678";
System.out.println("mobile number 1 테스트 결과 ==> " + mobNum1.matches(regExp));
cs


mobNum1 의 값이 01 로 시작했고 세번째 값이 0으로 첫번째 자리는 모두 정상적으로 들어 왔습니다. 

두번째 및 세번째 자리는 모두 숫자 값이고 7 ~ 8자리 (두자릿수 합) 의 값이어야 하는데 8자리로 이 것 역시 문제 없는 값으로 확인 됩니다. 


위 코드를 실행한 결과는 아래와 같습니다. 


Result

mobile number 1 테스트 결과 ==> true



1
2
String mobNum2 = "010-1234-5678";
System.out.println("mobile number 2 테스트 결과 ==> " + mobNum2.matches(regExp));
cs


구분자로 " - " 를 이용했습니다. 표현식에서 허용한 문자입니다. 


위 코드를 실행한 결과는 아래와 같습니다. 


Result

mobile number 2 테스트 결과 ==> true



1
2
String mobNum3 = "010.1234.5678";
System.out.println("mobile number 3 테스트 결과 ==> " + mobNum3.matches(regExp));
cs


두번째 예제의 구분자를 " . " 로 변경 했습니다. 


위 코드를 실행한 결과는 아래와 같습니다. 


Result

mobile number 3 테스트 결과 ==> true



1
2
String mobNum4 = "0101234-.5678";
System.out.println("mobile number 4 테스트 결과 ==> " + mobNum4.matches(regExp));
cs


4 와 5 사이에 " - " 와 " . " 두개를 같이 사용했습니다. 

둘다 허용된 문자열이지만 둘중 한개 또는 둘다 오지 않아야 합니다. 


위 코드를 실행한 결과는 아래와 같습니다. 


Result

mobile number 4 테스트 결과 ==> false



1
2
String mobNum5 = "110-1234-5678";
System.out.println("mobile number 5 테스트 결과 ==> " + mobNum5.matches(regExp));
cs


첫세자리는 01 로 시작을 해야 하는데 110 으로 시작 하는 것으로 지정 했습니다. 

당연히 허용되지 않는 패턴입니다. 


위 코드를 실행한 결과는 아래와 같습니다. 


Result

mobile number 5 테스트 결과 ==> false



숫자 간 구분자 값을 추가 하거나 변경하는 등의 제한하는 표현식을 원하는 방식대로 변경 적용하시면 사용 하는데 불편함이 없을 겁니다. 




 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


이번 포스팅에서는 자바 정규표현식을 이용하여 간단한 이메일 패턴을 만들어 볼까 합니다. 


사실 완벽한 이메일 패턴을 만든다는 것은 거의 불가능? 에 가깝습니다.

왜냐하면 우리가 모르는 이메일 패턴이 도처에 깔려 있기 때문입니다. 

또한 이메일 서비스를 하는 업체마다 입력 가능한 문자열의 허용 범위가 다르기 때문에 그것들을 모두 만족 하는 이메일 패턴 정규표현식을 만들기는 거의 불가능 하다고 보시면 됩니다. 


그럼에도 불구하고 이메일 패턴을 만들어 본다고 한것은... 

우리 사이트에서 제공하고 허용하는 이메일 패턴을 만들어 보자는 의도 입니다. 

내가 만든 패턴에 부합하는 이메일 주소 형식만 허용 하겠다! 

멋지지 않나요? ^^


그럼 시작해 보겠습니다. 



■ 정규표현식으로 이메일 주소 패턴 만들기



xxxxxx@xxxx.xxx

xxxxxx@xxxx.xxx.xx


일반적으로 이메일 주소 형태는 위와 같이 @ 를 기준으로 ID 부HOST 부로 나뉩니다. 


이 ID 와 HOST 부에 적용할 이메일 주소 패턴의 형태를 정하겠습니다. 


ID 부 설정

▶ 영문 대소문자 허용

▶ 숫자 허용

 .   -  등 5가지 특문 허용


HOST 부 설정

▶ 영문 대소문자 허용

▶ 숫자 허용

▶  .  -  등 2가지 특문 허용

▶ 위 값이 최소 1개 이상 표기된 후  추가

▶ 마침표 뒤에는 영문자 대소문자 만 허용

▶ 마침표 뒤의 문자 셋은 최소 2 ~ 최대 6 자리 까지만 허용


위와 같이 패턴을 정리 했습니다. 


그럼 위 조건에 맞게 이메일 주소 패턴을 만들어 보겠습니다. 



■ ID 부 패턴 만들기 


우선 ID 부의 영문 대소문자 및 숫자 허용 하는 문자셋을 만들어 보겠습니다. 

^[a-zA-Z0-9]

너무 간단합니다. 지금껏 많이 봐오셨죠? 

정규표현식 시작은 ^ 를 붙이니 잊지 말고 챙겨 줍니다. 


이 문자셋에 위 5가지 특문을 허용 하는 것으로 해보겠습니다. 간단합니다. 

그냥 문자셋 안에 나열만 하시면 됩니다. 

^[a-zA-Z0-9._%+-]


선행 문자셋이 최소 1개 이상 와야 된다는 조건으로 문자셋 [...] 다음에 + 를 추가 해줍니다. 

^[a-zA-Z0-9._%+-]+


여기까지가 ID 부 입니다. 간단하죠 ^^



물론 뒤에 바로 @ 를 붙여하니 HOST 부 시작전 최종 모습은 아래와 같습니다. 

^[a-zA-Z0-9._%+-]+@



■ HOST 부 패턴 만들기


시작은 동일하게 영문 대소문자 및 숫자 허용 하는 것으로 지정 하겠습니다. 

[a-zA-Z0-9]


2가지 특문 허용하기 위해 문자셋 안에 나열해 주면 됩니다. 

[a-zA-Z0-9.-]


위 문자셋 중 최소 한가지 이상의 값이 나오는 것으로 지정해 줍니다. 

[a-zA-Z0-9.-]+


이제 마침표 하나 들어 와야겠죠? 자바에서는 back slash (\) 를 사용하기 위해 이스케이프 문자인 back slash를 한번 더 사용합니다. 그래서 두개와 나란히 옵니다. 

[a-zA-Z0-9.-]+\\.


마지막으로 2 ~ 6자리 영문자만 허용 하는 것을 추가 해보겠습니다. 

[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}


이제 $ 표시를 이용하여 정규표현식 마무리라른 것을 선언해주면 되겠죠? 최종 모습은 아래와 같습니다. 

[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$



이렇게 정리된 표현식을 자바 코드를 이용해서 테스트 해보겠습니다. 



1
String regExp = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$";
cs


이메일 주소 패턴을 위와 같이 작성을 했습니다. 


테스트 코드은 아래와 같이 4가지 이메일 주소를 만들어 봤습니다. 


1
2
3
4
String emailAddr1 = "testMail1004@james.com";
String emailAddr2 = "testMail-1004@james.com";
String emailAddr3 = "testMail-1004@james-test.com";
String emailAddr4 = "test.Mail-1004@james-test.co.kr";
cs


1번 부터 3번까지는 쉽게 이해가 되시겠죠? 

모두 표현식에 맞는 이메일 주소 패턴입니다. 


4번의 경우  xxxx . xx . xx 라는 형식으로 들어 왔습니다. 

이 경우는 표현식 패턴에 맞는 메일 형식일까요? 


위에서 HOST 부 패턴 만들때 첫번째 문자셋 안에 마침표 ( . )를 허용 하는 것으로 작성 했습니다. 

그렇기 때문에 james-test 라는 문자열 뒤에 마침표( . )가 들어와도 문제 없습니다. 


위 값들을 아래와 같은 코드로 실행 시켜 보겠습니다. 


1
2
3
4
System.out.println("email address 1 테스트 결과 ==> " + emailAddr1.matches(regExp));
System.out.println("email address 2 테스트 결과 ==> " + emailAddr2.matches(regExp));
System.out.println("email address 3 테스트 결과 ==> " + emailAddr3.matches(regExp));
System.out.println("email address 4 테스트 결과 ==> " + emailAddr4.matches(regExp));
cs



결과는 아래와 같습니다. 


Result

email address 1 테스트 결과 ==> true

email address 2 테스트 결과 ==> true

email address 3 테스트 결과 ==> true

email address 4 테스트 결과 ==> true


모두 만들어 둔 패턴에 맞는 형식들입니다. 



하지만 문제점도 있습니다. 


1
String emailAddr5 = "test.Mail-1004@james-test..kr";
cs


위와 같이 HOST 부에 마침표 ( . ) 가 중복으로 입력되는 경우가 있을 수 있겠는데요. 

현재 만들어 둔 표현식으로는 위 코드를 실행해도 패턴에 맞는 형식으로 나옵니다. 


1
System.out.println("email address 5 테스트 결과 ==> " + emailAddr5.matches(regExp));
cs


Result

email address 5 테스트 결과 ==> true



이런 많은 경우의 수를 생각해서 추가적으로 표현식을 디테일하게 작성할 수도 있습니다. 


예를 들면 아래와 같은 이메일 주소 패턴을 만들어 사용 할 수 있습니다. 


(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])


출처: http://emailregex.com/



위 패턴을 이용하면 좀더 디테일한 이메일 주소 패턴이 될 수 있습니다. 

하지만 이 패턴 역시 완벽하진 않습니다. 


앞서 언급했듯이 수많은 형식의 이메일 주소 패턴들이 존재하고 있기 때문입니다. 



지금까지 정규표현식을 이용하여 이메일 주소 패턴을 만들어 봤습니다. 

여기서 요건에 따라 더 추가하거나 빼는 방식으로 나만의 이메일 주소 패턴을 만들어 가는 것도 좋을 것 같습니다. 



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D

블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


이번에는 정규표현식을 이용하여 암호 설정을 위한 표현식을 만들어 보겠습니다. 


■ 정규표현식으로 암호 패턴 만들기


암호 규칙을 아래와 같이 순차적으로 만들어 보겠습니다. 



▶ 숫자 최소 1자 포함

▶ 영문대문자 최소 1자 이상 포함

▶ 영문소문자 최소 1자 이상 포함

▶ 최소 8자 ~ 최대 20자 허용



위 조건을 만족하는 암호 체크 표현식을 만들어 보겠습니다. 



1
String regExp = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{8,20}$";
cs


위와 같이 표현식을 하나 작성했습니다. 


(?=.*[0-9])

0 ~ 9 까지 숫자 최소 한개를 의미


(?=.*[a-z])

영문소문자 a ~ z 까지의 문자 최소 한개


(?=.*[A-Z])

영문대문자 A ~ Z 까지의 문자 최소 한개


.{8, 20}

선행 세가지 표현식 (숫자, 영문소문자, 영문대문자)에 맞는 8 ~ 20 자리 문자열




우선 위 표현식이 정상 동작하는지 여부 테스트 해봐야 겠죠? 


1
2
String input1 = "abc123";
System.out.println("input1 정규표현식 적용 결과 ==> "+input1.matches(regExp));
cs


우선 길이가 6인 문자열을 테스트 해봤습니다. 

영문소문자와 숫자는 들어가 있지만 대문자가 빠져 있으니 테스트 결과는 예상 가능합니다. 


Result

input1 정규표현식 적용 결과 ==> false




1
2
String input2 = "abcd1234";
System.out.println("input2 정규표현식 적용 결과 ==> "+input2.matches(regExp));
cs


테스트 문자열의 길이는 8자리로 최소한의 길이 조건은 맞지만...

영문대문자가 없습니다. 결과는 아래와 같습니다. 


Result

input2 정규표현식 적용 결과 ==> false




1
2
String input3 = "abcd1234B";
System.out.println("input3 정규표현식 적용 결과 ==> "+input3.matches(regExp));
cs


테스트 문자열의 길이는 9로 조건 만족,

영문 대소문자 모두 포함하고 있으며 숫자도 포함하고 있습니다. 

모든 조건을 만족합니다. 결과는 아래와 같습니다.


Result

input3 정규표현식 적용 결과 ==> true




이제 몇 가지 조건을 더 추가해 보겠습니다. 


▶ 특수문자 필수 입력

▶ 공백문자 허용안함


위와 같은 추가 조건을 더 입력해 보겠습니다. 


1
String regExp = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*\\W)(?=\\S+$).{8,20}$";
cs


기존 표현식에 


(?=.*\\W) 

특수문자 최소 한개 입력


(?=\\S+$)

공백문자는 허용하지 않고, 공백문자가 허용되지 않는 형태를 1회 이상 일치 시킴 (즉, 공백문자는 처음부터 끝까지 허용하지 않음)


위와 같이 두가지 표현식 그룹을 추가 했습니다. 


잘 동작하는 지 테스트 해보겠습니다. 




1
2
String input1 = "abc123";
System.out.println("input1 정규표현식 적용 결과 ==> "+input1.matches(regExp));
cs


6자리 문자열입니다. 당연히 false 가 리턴 됩니다. 


Result

input1 정규표현식 적용 결과 ==> false




1
2
String input2 = "abcd1234";
System.out.println("input2 정규표현식 적용 결과 ==> "+input2.matches(regExp));
cs


8자리 문자열이지만 영문소문자 와 숫자만 있습니다. 

조건을 만족하지 않죠!


Result

input2 정규표현식 적용 결과 ==> false




1
2
String input3 = "abcd1234!";
System.out.println("input3 정규표현식 적용 결과 ==> "+input3.matches(regExp));
cs


자릿수 조건 충족 & 영문소문자 & 숫자 & 특문 컨디션이지만 영문대문자가 빠졌습니다. 


Result

input3 정규표현식 적용 결과 ==> false




1
2
String input4 = "abcd0!@!B";
System.out.println("input4 정규표현식 적용 결과 ==> "+input4.matches(regExp));
cs


자릿수 만족 & 영문소문자 & 영문대문자 & 특문 & 숫자 등 모든 조건을 만족 했습니다. 

문자열 내에 공백문자도 없습니다. 


제대로 조건을 만족 했습니다. 


Result

input4 정규표현식 적용 결과 ==> true




1
2
String input5 = "abcd0 !@!B";
System.out.println("input5 정규표현식 적용 결과 ==> "+input5.matches(regExp));
cs


바로 위 문자열 중간에 공백문자를 추가 했습니다. 

당연히 false 가 리턴 됩니다. 


Result

input5 정규표현식 적용 결과 ==> false




일반적으로 많이 사용하고 있는 비밀번호 패턴을 정규표현식을 이용하여 작성해봤습니다. 


상황에 맞게 잘 수정해서 사용 하시길 바라겠습니다. 



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D


블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


자바 정규표현식에서 한글만 허용하는 방법에 대해 정리해보겠습니다. 



■ 정규표현식 한글만 허용하기


1
String regExp = "^[가-힣]*$";
cs


위 표현식은 가 ~ 힣 까지의 한글을 허용 한다는 표현식입니다. 

뒤에 * 을 붙여서 입력이 안되어도 한글입력으로 인정합니다. 




샘플 코드 보시겠습니다. 


1
2
String input1 = "가나뷁";
System.out.println("input1 정규표현식 적용 결과 ==> "+input1.matches(regExp));
cs


문자열이 "가" ~ "힣" 범위 안에 들어 가는 한글들로 구성 되어 있습니다. 

위 코드 실행 결과는 아래와 같습니다. 


input1 정규표현식 적용 결과 ==> true




1
2
String input2 = "";
System.out.println("input2 정규표현식 적용 결과 ==> "+input2.matches(regExp));
cs


입력값이 없는 상태라도 한글로 인정 됩니다. 표현식에 보시면 * 을 추가 했는데요. 앞의 표현식이 입력되지 않아도 허용 한다는 의미 입니다. 


위 코드 실행 결과는 아래와 같습니다. 


input2 정규표현식 적용 결과 ==> true




1
2
String input3 = "공백 추가";
System.out.println("input3 정규표현식 적용 결과 ==> "+input3.matches(regExp));
cs


문자열에 공백이 추가 되었습니다. 정규표현식 상에서 공백을 허용하겠다는 내용이 없으므로 위 코드 실행 결과는 false 가 리턴 되어야 정상입니다. 


위 코드 실행 결과는 아래와 같습니다. 


input3 정규표현식 적용 결과 ==> false




■ 정규표현식 한글만 허용하기 (공백문자 허용)


그렇다면 공백을 허용 하고자 한다면 어떻게 해야 할까요? 

표현식으로 작성한 부분은 다음과 같습니다.


^[가~힣]*$


가 ~ 힣 까지 모두 허용 하는데 여기에 공백문자도 허용하겠다고 선언 하면 됩니다. 


1
String regExp = "^[가-힣\\s]*$";
cs


위와같이 \\s 를 추가 해줬습니다. \s 는 공백문자 허용 한다는 내용입니다. 

결과는 어떻게 나올까요? 당연히 true 로 리턴 됩니다. 


input3 정규표현식 적용 결과 ==> true




■ 정규표현식 한글만 허용하기 (자음&모음 허용)


1
2
String input4 = "레알ㄷㄷㄷㅏㄷㅏ";
System.out.println("input4 정규표현식 적용 결과 ==> "+input4.matches(regExp));
cs



이번에는 자음과 모음이 문자열에 포함되었습니다. 작성한 표현식 상에 자음 / 모음에 관한 정의를 하지 않았다는 것을 생각하면 실행 결과는 예상 가능하시죠? 


input4 정규표현식 적용 결과 ==> false



자음과 모음도 허용하는 표현식을 만들어 보겠습니다. 


1
String regExp = "^[ㄱ-ㅎ|ㅏ-ㅣ|가-힣\\s]*$";
cs


자음 ㄱ-ㅎ 추가 후 or 을 의미하는 " | " 값으로 구분합니다.

모음 ㅏ-ㅣ 추가 후 or 을 의미하는 " | " 값으로 구분합니다.

그리고 기존 표현식을 추가 해주면 자음, 모음을 포함한 한글 허용하기 표현식이 됩니다. 


실행 결과는 아래와 같습니다. 


input4 정규표현식 적용 결과 ==> true




상황에 따라 한글만 허용하더라도 자음/모음은 허용 하지 않거나 허용 해야 하는 경우가 다르게 나옵니다. 

상황에 맞게 표현식을 수정해가면 멋진 코딩을 할 수 있을 거라 생각됩니다. 




 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D


블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


앞서 정규표현식으로 파일 확장자 처리 하는 방법을 포스팅 했었는데요. 

abcd.tar.gz 와 같이 이중 파일 확장자가 있는 경우도 있습니다. 


이런 파일은 어떻게 처리 하는지 알아 보겠습니다. 




■ 정규표현식 이중 파일 확장자 처리


1
String regExp = "^([\\S]+(\\.(?i)(tar)+\\.gz)$)";
cs



위 코드는 abcd.tar.gz 파일 확장자를 정규표현식으로 변환한 것입니다. 

좀더 디테일하게 정리하면 아래와 같습니다. 


^

(

[\\S]

+

(

\\.

(?i)

(tar)

+

\\.gz

)

$

)

1

2

3

4

5

6

7

8

9

10

11

12

13



1: 정규표현식 시작 

2: 첫번째 영역 지정 소괄호 오픈

3: 공백문자가 아닌 문자열

4: 앞의 표현식 (3번) 이 1회 이상 일치 (공백문자가가 아닌 문자열이 꼭 와야 함)

5: 두번째 영역 지정 소괄호 오픈

6: 마침표( . )가 앞의 표현식 뒤에 따라옴

7: 대소문자 구분 없음

8: tar 라는 문자열만 허용 

9: 앞의 표현식 (8번) 이 1회 이상 일치

10: .gz 라는 문자열 포함

11: 두번째 영역 지정 소괄호 종료

12: 정규표현식 종료

13: 첫번째 영역 지정 소괄호 종료



앞서 일반적인 파일 확장자 정규표현식과 다른 부분이 위 8, 9, 10 입니다. 


8번의 경우 확장자 명을 기존 jpg, png 등 이미지 확장자 명에서 tar 로 변경 한 것입니다. 

9번의 경우 8번이 1회 이상 일치 해야 함을 지정 한 것입니다. 

10번의 경우 .gz 가 마지막에 따라 와야 함을 지정 한 것입니다. 



1
2
3
4
5
6
7
8
9
10
11
String regExp = "^([\\S]+(\\.(?i)(tar)+\\.gz)$)";
        
String input1 = "james.tar.gz";
String input2 = "james.zip.gz";
String input3 = ".tar.gz";
String input4 = "james..gz";
 
System.out.println("input1 정규표현식 적용 결과 ==> "+input1.matches(regExp));
System.out.println("input2 정규표현식 적용 결과 ==> "+input2.matches(regExp));
System.out.println("input3 정규표현식 적용 결과 ==> "+input3.matches(regExp));
System.out.println("input4 정규표현식 적용 결과 ==> "+input4.matches(regExp));
cs



input1 은 abcd.tar.gz 라는 파일 형식에 제대로 맞춰서 입력값을 초기화 했습니다. 

나머지 변수값들은 좀 비정상 적이죠? ^^;;


Results


input1 정규표현식 적용 결과 ==> true

input2 정규표현식 적용 결과 ==> false

input3 정규표현식 적용 결과 ==> false

input4 정규표현식 적용 결과 ==> false




 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D


블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


이번 포스팅에서는 정규표현식으로 지정된 파일 확장자만 허용 하는 방법에 대해 정리 하겠습니다.  



■ 정규표현식 파일 확장자 허용


1
String regExp = "^([\\S]+(\\.(?i)(jpg|png|gif|bmp))$)";
cs



위 표현식을 정리 하면 아래와 같습니다. 


^

(

[\\S]

+

(

\\.

(?i)

(jpg|png|gif|bmp)

)

$

)

1

2

3

4

5

6

7

8

9

10

11 


1: 정규표현식 시작 

2: 첫번째 영역 지정 소괄호 오픈

3: 공백문자가 아닌 문자열

4: 앞의 표현식 (3번) 이 1회 이상 일치 (공백문자가 아닌 문자열이 꼭 와야 함)

5: 두번째 영역 지정 소괄호 오픈

6: 마침표( . )가 앞의 표현식 뒤에 따라옴

7: 대소문자 구분 없음

8: jpg, png, gif, bmp 등의 문자열 조합 허용

9: 두번째 영역 지정 소괄호 종료

10: 정규표현식 종료

11: 첫번째 영역 지정 소괄호 종료



1
2
3
4
5
6
7
8
9
String regExp = "^([\\S]+(\\.(?i)(jpg|png|gif|bmp))$)";
        
String input1 = "abc.jpg";
String input2 = "def jpg";
String input3 = "def.txt";
        
System.out.println("input1 정규표현식 적용 결과 ==> "+input1.matches(regExp));
System.out.println("input2 정규표현식 적용 결과 ==> "+input2.matches(regExp));
System.out.println("input3 정규표현식 적용 결과 ==> "+input3.matches(regExp));
cs



위와 같이 세가지 문자열을 정규표현식으로 검사 해보겠습니다. 


input1 은 abc.jpg 로 셋팅 했습니다. 

많이 보던 파일명 형식이죠? 


input2 는 중간에 . 이 빠진 형태 입니다. ( . ) 을 제대로 인식 하는지 여부 확인 용입니다. 


input3 은 파일 확장자 명이 txt 입니다. 정규표현식에 없는 확장자 명을 지정 했습니다. 



Results


input1 정규표현식 적용 결과 ==> true

input2 정규표현식 적용 결과 ==> false

input3 정규표현식 적용 결과 ==> false



input1 을 제외한 나머지는 정규표현식에 맞지 않는 형식이기에 false 가 리턴 되었습니다. 



파일 확장자 정규표현식은 블로그나 카페에 여기저기 많이 있긴 한데요. 

실제 테스트 해보시면 특정 케이스가 제대로 걸러지지 않는 경우가 많아 수정에 수정을 했습니다. 


잘 사용하시길 바라겠습니다. 



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D


블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,