일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- Pattern
- Python
- centos
- framework
- ai
- mariaDB
- java
- Security
- Deep
- learning
- Github
- Numpy
- LIST
- SSH
- DeepLearning
- Analysis
- 자바
- error
- git
- Web
- javascript
- db
- mysql
- 함수
- Server
- data
- Spring
- Linux
- interface
- 인공지능
- Today
- Total
PostIT
[Java/Regex] 자바 정규표현식에 대해서 공부하고 예제 만들기 본문
# [Java/Regex] 자바 정규표현식에 대해서 공부하고 예제 만들기
최종작성일 : 2017년 6월 2일
## 배경
Web Project를 진행하면 Client에게서 어떠한 정보가 입력될지 모르기에, 이 정보를 정규화하는 과정이 필요합니다. 이를 유효성 검사라고 하는데 유효성검사를 제대로 하지않으면, 데이터의 신뢰도가 떨어지게 되고, 예기치 않은 에러를 발생시키기 때문입니다. 이를 위해서는 각 언어마다 정규표현식을 제공해주고 있으며, 크게 다르지 않습니다.
그렇다면, 이번 블로그를 통해 Java의 정규표현식에 대해서 알아보겠습니다.
## 목적
- 자바의 정규표현식의 규칙을 이해하고, 예제를 만들어서 새로운 정규형식을 만들어보겠습니다.
## 내용
표현식 | 설명 |
^ | 문자열의 시작 |
$ | 문자열의 종료 |
. | 임의의 한 문자(필수입력, 문자의 종류 가리지 않음) 단, \ 는 넣을 수 없음 |
* | 앞 문자가 없을 수도 무한정 많을 수도 있음 |
+ | 앞 문자가 하나 이상 |
? | 앞 문자가 없거나 하나있음 |
[] | 문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타낸다. []내에서 ^가 선행하여 존재하면 not 을 나타낸다. |
{} | 횟수 또는 범위를 나타낸다. |
() | 소괄호 안의 문자를 하나의 문자로 인식 |
| | 패턴 안에서 or 연산을 수행할 때 사용 |
\s | 공백 문자 |
\S | 공백 문자가 아닌 나머지 문자 |
\w | 알파벳이나 숫자 |
\W | 알파벳이나 숫자를 제외한 문자 |
\d | 숫자 [0-9]와 동일 |
\D | 숫자를 제외한 모든 문자 |
\ | 정규표현식 역슬래시(\)는 확장 문자 |
(?i) | 앞 부분에 (?i) 라는 옵션을 넣어주면 대소문자를 구분하지 않음 |
간단하게 정적변수로 선언해서 테스트 할 수 있는 예제 코드를 만들어보겠습니다.
지역 정적변수로 선언된 패턴에 더 입력하실 수 있습니다.
eixt를 입력하면 종료됩니다. 아니면 계속 테스트 해볼 수 있습니다.
import java.util.Iterator;
import java.util.Scanner;
public class TestJava {
//지역 정적변수 - 패턴을 바꾸고 싶을 떄 여기를 바꾸세요. 더 갯수를 늘려 테스트하고싶으면
// for문 안에 있는 i(=4)를 맞게 늘려주시고, switch case에 추가해주세요.
final private static String pattern1 = "^[가-힣]*$";
final private static String pattern2 = "^[a-zA-Z]*$";
final private static String pattern3 = "^[0-9]*$";
final private static String pattern4 = "^[a-zA-Z가-힣]*$";
public static void main(String[] argrs) {
Scanner scan=new Scanner(System.in);
reInput(scan);
}
private static void reInput(Scanner scan){
System.out.println("parameter을 입력해주세요.(한글 재입력시 숫자나 영어를 입력하고 지우고 입력해주세요. 바이트 문제로 인해 입력 불가능 문제");
String parameter = scan.next();
if(parameter.equals("exit")){
System.out.println("종료합니다.");
return;
} else {
for (int i = 0; i < 4; i++) {
validPattern(parameter, i);
}
System.out.println("------------------------------");
reInput(scan);
}
}
//Pattern에 틀리면 True || 맞으면 False
private static boolean validPattern(String parameter, int patternNo) {
boolean validation = false;
switch (patternNo) {
case 0:
validation = parameter.matches(pattern1);
System.out.println("patternNo : "+patternNo+" : "+validation);
break;
case 1:
validation = parameter.matches(pattern2);
System.out.println("patternNo : "+patternNo+" : "+validation);
break;
case 2:
validation = parameter.matches(pattern3);
System.out.println("patternNo : "+patternNo+" : "+validation);
break;
case 3:
validation = parameter.matches(pattern4);
System.out.println("patternNo : "+patternNo+" : "+validation);
break;
}
return validation;
}
}
1. 자주 쓰이는 패턴
1) 숫자만 : ^[0-9]*$
2) 영문자만 : ^[a-zA-Z]*$
3) 한글만 : ^[가-힣]*$
4) 영어 & 숫자만 : ^[a-zA-Z0-9]*$
5) E-Mail : ^[a-zA-Z0-9]+@[a-zA-Z0-9]+$
6) 휴대폰 : ^01(?:0|1|[6-9]) - (?:\d{3}|\d{4}) - \d{4}$
7) 일반전화 : ^\d{2.3} - \d{3,4} - \d{4}$
8) 주민등록번호 : \d{6} \- [1-4]\d{6}
9) IP 주소 : ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3})
2. 분석
- ^ : 문자열 시작을 알립니다.
- [ ] : 안에 정해진 문자형식범위를 나타냅니다. 대괄호 안에 ^있으면 not을 나타냅니다.
ex) ^[^a-zA-z]*$ 를 입력하면 영어는 아닌 문자를 의미합니다. - ( ) : 하나의 문자로 취급합니다.
ex) (abc) 패턴일 경우 : abc외에는 모두 false처리 됩니다. (abc)* 의 경우 abc의 반복을 제외하고 모두 false처리됩니다. - { } : 횟수 또는 길이를 나타내어줍니다.
- * : 이전 문자의 갯수의 제한을 두지 않습니다. *를 입력하지 않으면 개수를 1개로 인정하고 조건이 맞아도 문자 길이가 1를 넘어가면 false를 반환합니다.
- + : 앞에 있는 정규식 형식이 1개가 꼭 들어가야 한다는 의미입니다..
- \\d : \를 2개 붙이는 이유는 "\\d" 문자 안에서 \ 다음 \문자가 특수문자라고 알려주는 것과 같습니다. 이 형식을 사용하면 숫자만 true를 반환합니다.
ex) ^[a-zA-Z]+\\d{2} 는 어떠한 값이 true를 반환할까?
=> ^시작열을 알리기에 앞에 a~Z까지 +로 인해 문자가 꼭 1개 들어가야 합니다.. 그리고 숫자 2개를 포함한다라고 해석 할 수 있습니다.
'Java' 카테고리의 다른 글
[Java] Wrapper class란 무엇인가? 그리고, Boxing과 UnBoxing (0) | 2017.07.21 |
---|---|
[Java/Comparator/Comparable] 자바 객체 비교를 위한 인터페이스 분석 (0) | 2017.06.03 |
[Interpreter/Compiler] 인터프리터와 컴파일러의 차이점 (0) | 2017.06.01 |
[Java/JVM] JVM 이해를 통한 Java 작동원리 이해하기 (0) | 2017.06.01 |
[Java/Stack/Heap] JAVA의 Stack과 Heap의 이해를 통해 Java의 메모리 관리 (1) | 2017.05.31 |