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


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


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

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

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


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

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

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

멋지지 않나요? ^^


그럼 시작해 보겠습니다. 



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



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 등의 프로그래밍 언어를 소개 합니다.

,



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


이번 포스팅에서는 정규표현식으로 영문자만 허용하는 방법에 대해 정리 하겠습니다. 



■ 정규표현식 영문자만 허용하기 (대소문자 구분없이 모두 허용)


1
String regExp =  "^[a-zA-Z]*$";
cs



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


^[a-zA-Z]*$


^ => 문자열 시작

a-z => 소문자 a ~ z 까지 허용

A-Z => 대문자 A ~ Z 까지 허용

* => 앞에 문자가 없거나 무한대로 많이 있을 수 있음 

$ => 문자열 종료



즉, 대소 문자 구분없이 영문자 모두를 허용하며 빈값도 허용한다는 표현식 입니다. 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
String regExp =  "^[a-zA-Z]*$";
 
String testStr1 = "James";
String testStr2 = "james";
String testStr3 = "JAMES";
String testStr4 = "j a m e s";
String testStr5 = "J A M E S";
String testStr6 = "";
        
System.out.println("testStr1 ==> "+testStr1.matches(regExp));
System.out.println("testStr2 ==> "+testStr2.matches(regExp));
System.out.println("testStr3 ==> "+testStr3.matches(regExp));
System.out.println("testStr4 ==> "+testStr4.matches(regExp));
System.out.println("testStr5 ==> "+testStr5.matches(regExp));
System.out.println("testStr6 ==> "+testStr6.matches(regExp));
cs


testStr1 은 대소문자 같이 포함한 문자열입니다. 

testStr2 는 소문자만 포함한 문자열

testStr3 은 대문자만 포함한 문자열

testStr4 는 소문자만 포함한 문자열이지만 띄어쓰기를 했습니다. 

testStr5 는 대문자만 포함한 문자열이지만 역시 띄어쓰기를 했습니다. 

testStr6 은 빈값으로 설정 했습니다. 


각각의 변수를 String 객체의 matches 함수를 이용하여 결과값을 찍어 봤습니다. 


결과는 아래와 같습니다. 


testStr1 ==> true

testStr2 ==> true

testStr3 ==> true

testStr4 ==> false

testStr5 ==> false

testStr6 ==> true



4, 5번의 경우 문자열에 띄어쓰기가 포함되어 있어 false 가 리턴 되었습니다. 

6번은 아무 값도 없는 상태 이기 때문에 true 가 리턴 되었습니다. 만약 6번이 띄어쓰기만 있었다면 역시 false 가 리턴 됩니다. 




■ 정규표현식 영문자 대문자만 or 소문자만 허용하기 


1
String regExpLowerCaseOnly =  "^[a-z]*$";
cs


위 표현식과 같이 a-z 만 추가 하면 소문자만 인정하는 표현식이 됩니다. 



1
String regExpUpperCaseOnly =  "^[A-Z]*$";
cs


소문자를 대문자로 변경 하기만 하면 대문자만 인정하는 표현식이 됩니다. 



간단하죠? ^^


영문자 관련 정규표현식은 많이 사용하는 것이니 잘 기억해두시고 사용하시면 좋을거예요 ^^



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

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

감사합니다 :D


블로그 이미지

쉬운코딩이최고

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

,



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


앞서 정규표현식 (Regular Expression) 에 대해 간단히 정리 했었습니다. 

이번에는 정규표현식 중 숫자만 허용 하는 표현식을 알아 보겠습니다. 




■ 정규표현식 숫자만 허용하기


1
String regExp = "^[0-9]+$";
cs


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


^ => 문자열의 시작

[...] => 문자의 집합, 두 문자 사이에 - 기호를 이용하여 범위를 지정 [0-9] 와 같이 입력하여 0 ~ 9 를 표현 

+ => 앞에 문자가 최소 한개이상 있음, 여기서는 0 ~ 9 사이의 숫자의 갯수 제한이 없음을 의미

$ => 문자열 종료 


다시 정리 하면 아래와 같습니다. 



^[0-9]+$


문자열 시작 

[0 ~ 9 까지 숫자 인정] 

0 ~ 9 까지 숫자 갯수 제한 없음

문자열 종료



위 표현식이 정말 숫자만 허용 하는지 확인 해보겠습니다. 


1
2
3
4
5
6
7
String testStr1 = "12345";
 
if(testStr1.matches(regExp)){
    System.out.println("testStr1 ==> 숫자만 입력 됨");
}else {
    System.out.println("testStr1 ==> 숫자 외 다른 문자도 입력 됨");
}
cs


testStr1 이라는 변수에 숫자만 1 ~ 5 까지 나열 되어 있습니다. 

그냥 봐도 숫자만 입력 된 것이 맞죠? ^^


결과는 아래와 같습니다. 

testStr1 ==> 숫자만 입력 됨



1
2
3
4
5
6
7
String testStr2 = "1T2E3S4T5";
 
if(testStr2.matches(regExp)){
    System.out.println("testStr2 ==> 숫자만 입력 됨");
}else {
    System.out.println("testStr2 ==> 숫자 외 다른 문자도 입력 됨");
}
cs


testStr2 이라는 변수에는 숫자와 문자의 조합인 값이 들어 있습니다. 


결과는 아래와 같습니다.

testStr2 ==> 숫자 외 다른 문자도 입력 됨



1
2
3
4
5
6
7
String testStr3 = "";
 
if(testStr3.matches(regExp)){
    System.out.println("testStr3 ==> 숫자만 입력 됨");
}else {
    System.out.println("testStr3 ==> 숫자 외 다른 문자도 입력 됨");
}
cs


testStr3 이라는 변수는 빈 값으로 설정 했습니다. 


결과는 아래와 같습니다.

testStr3 ==> 숫자 외 다른 문자도 입력 됨




■ 정규표현식 숫자와 공백 허용하기


위 세번째 예제를 사용한 이유는 숫자만 허용하는 표현식을 많이 사용 하기도 하지만 더 많이 사용 하는 것이 숫자와 빈값을 인정하는 표현식을 더 많이 사용하기 때문입니다. 


앞선 숫자만 허용하는 표현식에서는 + 라는 표현식을 이용하여 선행 문자의 갯수를 1개 이상으로 지정 했었습니다. 하지만 이 표현식을 * 로 변경할 경우 선행 문자의 갯수가 0개 이상으로 지정 할 수 있습니다. 


예제를 보시겠습니다. 


1
2
3
4
5
6
7
String regExp2 = "^[0-9]*$";
String testStr4 = "";
if(testStr4.matches(regExp2)){
    System.out.println("testStr4 ==> 숫자만 입력 됨");
}else {
    System.out.println("testStr4 ==> 숫자 외 다른 문자도 입력 됨");
}
cs


regExp2 변수는 0 ~ 9 사이의 숫자가 0개 이상인 것으로 지정 했습니다. 


결과는 아래와 같습니다. 

testStr4 ==> 숫자만 입력 됨



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

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

감사합니다 :D




블로그 이미지

쉬운코딩이최고

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

,



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


이번 포스팅 부터는 정규식에 대해 정리 하고자 합니다.


정규표현식(Regular Expression)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어 입니다. Pattern Matching 이라고도 부릅니다.


이 정규식을 사용하는 방법에 대해 알아보겠습니다. 


표현식 상세
^ 문자열의 시작을 의미
$ 문자열의 종료를 의미
. 줄바꿈을 제외한 임의의 문자를 의미. 줄바꿈을 위한 m 옵션은 허용
[...] [] 사이에 있는 임의의 문자 또는 문자집합. 문자의 집합은 시작 문자와 종료 문자 사이에 - 기호로 범위를 지정
[^...] [] 사이에 있는 임의의 문자 또는 문자집합을 제외
{} 회수 또는 범위를 의미
() 소괄호 안의 문자를 하나의 문자로 인식
\A 전체 문자의 시작
\z 전체 문자의 종료
\Z 허용되는 최종 라인 종결자를 제외한 전체 문자열의
re* 앞의 표현식이 0 이상 일치
re+ 앞의 표현식이 1 이상 일치
re? 앞의 표현식이 0 또는 1 일치
re{ n} 앞의 표현식이 정확히 n 일치
re{ n,} 앞의 표현식이 n 또는 이상 일치
re{ n, m} 앞의 표현식이 최소 n 최대 m 일치 
a| b a 또는 b 일치
(?i) (?i) 뒤에 옵션을 추가 대소문자 구분하지 않음
(re) 정규식을 그룹화하고 일치된 텍스트를 기억
(?: re) 정규식을 그룹화하고 일치하지 않는 텍스트를 기억
(?> re) 역추적 없이 독립적 패턴과 일치
\w 단어 문자와 일치
\W 단어 문자와 일치
\s 공백문자와 일치. [\t \n \r \f] 동일
\S 공백문자와 일치
\d 숫자와 일치. [0-9] 동일
\D 숫자가 아닌 모든 문자와 일치
\A 문자열의 시작과 일치
\Z 문자열의 종료와 일치. 만약 줄바꿈이 있다면 줄바꿈 이전 문자열과 일치
\z 문자열의 종료와 일치
\G 마지막 일치 위치가 끝난 지점과 일치
\n 캡처 그룹 번호 n 대한 참조
\b 대괄호 밖에 있을때 단어 경계와 일치. 대괄호 안에 있을때는 백스페이스 (0x08) 일치
\B 단어 경계와 일치
\n 줄바꿈과 일치
\t 탭과 일치
\Q, \E \Q \E 사이의 문자와 일치


정규표현식의 기본 패턴 들입니다. 

위 값들의 조합을 통해 원하는 표현식을 만들 수 있습니다. 




정규표현식은 아래와 같이 String 함수들과 함께 사용할 수 있습니다. 


s.matches("regular expression") 

s.split("regular expression")

s.replaceAll("regular expression")


이외에도 다른 String 함수들과 함께 사용 할 수 있습니다. 


1
2
3
4
5
6
7
8
String regExp = "^[a-zA-Z]*$";
        
String testStr1 = "TestCodeHere";
if(testStr1.matches(regExp)){
    System.out.println("testStr1 은 정규표현식에 맞는 문자열");
}else {
    System.out.println("testStr1 은 정규표현식에 맞지 않는 문자열");
}
cs


regExp 라는 변수에 "^[a-zA-Z]*&" 라는 표현식을 작성 했습니다. 

이 표현식은 우리가 일상 코딩중 가장 많이 사용하는 표현식으로 영문대소문자만 허용한다는 표현식입니다. 


String 함수중 matches 함수를 이용하여 testStr1 값이 regExp 표현식에 맞는지 비교 하는 코드 입니다. 

testStr1 값중 영문 대소문자 외에 어떤 텍스트도 보이지 않습니다. 결과 값은 예상 가능하죠? ^^


testStr1 은 정규표현식에 맞는 문자열




1
2
3
4
5
6
String testStr2 = "TestCodeHere.";
if(testStr2.matches(regExp)){
    System.out.println("testStr2 은 정규표현식에 맞는 문자열");
}else {
    System.out.println("testStr2 은 정규표현식에 맞지 않는 문자열");
}
cs


이번에는 동일한 표현식에 testStr2 값이 부합하는지 확인 해보겠습니다. 

testStr2 는 testStr1 값에 마침표( . )을 하나 추가 했습니다. 

정규 표현식 상에서는 영문대소문자만 허용하는 것으로 작성 했습니다. 

결과는 당연히 표현식에 맞지 않는 문자열이라는 값을 리턴해야 정상입니다. 


testStr2 은 정규표현식에 맞지 않는 문자열



1
2
3
4
5
6
String testStr3 = "Im James";
if(testStr3.matches(regExp)){
    System.out.println("testStr3 은 정규표현식에 맞는 문자열");
}else {
    System.out.println("testStr3 은 정규표현식에 맞지 않는 문자열");
}
cs


이번에는 문자열에 스페이스가 있습니다. 

두번째 예제를 이해 하셨다면 쉽겠죠? 당연히 정규표현식에 맞지 않는 문자열입니다. 


testStr3 은 정규표현식에 맞지 않는 문자열



이번 포스팅에서는 정규표현식의 기본을 간단히 정리 했습니다. 

앞으로 많이 사용하는 패턴들과 특수한 케이스에 대해 정리해 보겠습니다. 



아래 링크는 정규표현식을 테스트 해볼 수 있는 사이트 입니다. 

잘 이용하시길 바랍니다.


https://regexr.com/



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

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

감사합니다 :D




블로그 이미지

쉬운코딩이최고

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

,



 ■ Java Character - Character.toLowerCase() 함수



toLowerCase() 함수는 입력 받은 인자 값을 소문자로 변환하여 리턴해줍니다. 




Syntax

public static char toLowerCase( char ch )

public static int toLowerCase( int codePoint )




Example


1
2
System.out.println(Character.toLowerCase('T'));
System.out.println(Character.toLowerCase('\u0054'));
cs


대문자 'T' 와 Unicode 값을 입력 시 소문자 't' 로 리턴 해줍니다. 



1
System.out.println(Character.toLowerCase(84));
cs


대문자 'T' 를 의미하는 Unicode 숫자 값 84를 입력 시 소문자 't' 를 리턴 하는 것이 아니라 소문자 't'에 상응하는 Unicode 116을 리턴 합니다. 



1
System.out.println(Character.toLowerCase('자'));
cs


'자' 라는 한글을 입력 해 봅니다. 결과는 어떻게 나올까요? 

'자' 라는 한글은 영문자가 아닙니다. 그러니 대소문자 변환 할 것도 없죠.

위 코드를 실행 시 '자' 라는 값을 그대로 리턴 시킵니다.




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

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

감사합니다 :D



블로그 이미지

쉬운코딩이최고

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

,



 ■ Java Character - Character.toUpperCase() 함수



toUpperCase() 함수는 입력받은 인자 값을 영문 대문자로 변환하여 리턴합니다. 



Syntax

public static char toUpperCase ( char ch )

public static int toUpperCase ( int codePoint )



Example


1
2
System.out.println(Character.toUpperCase('t'));
System.out.println(Character.toUpperCase('\u0074'));
cs


소문자 't' 와 유니코드 값을 이용하여 대문자로 변환 하면 대문자 'T' 가 리턴됩니다. 



1
System.out.println(Character.toUpperCase('T'));
cs


인자 값이 대문자 일 경우 별도 변경 사항 없이 그대로 대문자 'T' 가 리턴 됩니다. 



1
System.out.println(Character.toUpperCase(116));
cs


인자 값이 int 형인 경우도 동일합니다. 

116 은 소문자 't' 를 의미 합니다. 대문자로 변경을 할 경우 대문자 'T' 가 리턴 되는 것이 아니라 대문자 'T' 에 상응하는 Unicode 숫자 값이 리턴 됩니다. 


실행 결과 84 가 리턴됩니다. 




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

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

감사합니다 :D




블로그 이미지

쉬운코딩이최고

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

,