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


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


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


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



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

,



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


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

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

,