정규화식 쓰기
오늘은 자바에서 지원하는 정규표현식을 이용해서 사용자가 설계된 원하는 값만 입력할 수 있도록 코드를 짜보겠습니다.
먼저 예제를 보여드린 뒤 자세히 알아보아요
예제1) 숫자만 허용
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
|
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class OnlyInteger {
public static void main(String[] args) {
Pattern p = Pattern.compile("(^[0-9]*$)");
int onlyNum;
String inputVal;
Scanner iStream = new Scanner(System.in);
inputVal = iStream.nextLine();
Matcher m = p.matcher(inputVal);
if(m.find())
{
onlyNum = Integer.parseInt(inputVal);
System.out.println(onlyNum);
}
else
{
System.out.println("숫자가 아닌데..?");
}
}
}
| cs |
▲ 사용자 입력값이 숫자인지 검증하는 OnlyInteger Class 입니다.
2
3
|
import java.util.regex.Matcher;
import java.util.regex.Pattern;
| cs |
▲ 정규표현식을 사용하기 위해 import해줍니다.
10
|
Pattern p = Pattern.compile("(^[0-9]*$)");
| cs |
▲ 숫자만 허용하는 Pattern p 입니다.
17
|
Matcher m = p.matcher(inputVal);
| cs |
▲ inputVal의 값이 저희가 선언한 패턴 p 에 맞는 조건인지 검사해서 m에 저장합니다.
19
|
if(m.find())
| cs |
▲ m.find() 는 패턴이 일치하는경우 boolean 형으로 true를 아니면 false를 리턴합니다.
21
|
onlyNum = Integer.parseInt(inputVal);
| cs |
▲ inputVal을 int형으로 형변환 해줍니다.
정규표현식 설명
대충 구조는 알았고 그럼 패턴을 만드는 방법을 알아보겠습니다.
10
|
Pattern p = Pattern.compile("(^[0-9]*$)");
| cs |
아까 예제1) 에서 사용한 Pattern 을 보면 "(^[0-9]*$)" 이 부분이 바로 패턴 부분입니다.
각각 의미를 알아보면..
표현식
|
설명
|
^
|
문자열의 시작
|
$
|
문자열의 종료
|
.
|
임의의 한 문자 (문자의 종류 가리지 않음)
단, \ 는 넣을 수 없음
|
*
|
앞 문자가 없을 수도 무한정 많을 수도 있음
|
+
| 앞 문자가 하나 이상 |
?
| 앞 문자가 없거나 하나있음 |
[]
|
문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타낸다. []내에서 ^가 선행하여 존재하면 not 을 나타낸다.
|
{}
| 횟수 또는 범위를 나타낸다. |
()
|
소괄호 안의 문자를 하나의 문자로 인식
|
|
|
패턴 안에서 or 연산을 수행할 때 사용
|
\s
|
공백 문자
|
\S
|
공백 문자가 아닌 나머지 문자
|
\w
| 알파벳이나 숫자 |
\W
| 알파벳이나 숫자를 제외한 문자 |
\d
| 숫자 [0-9]와 동일 |
\D
| 숫자를 제외한 모든 문자 |
\
| 정규표현식 역슬래시(\)는 확장 문자 역슬래시 다음에 일반 문자가 오면 특수문자로 취급하고 역슬래시 다음에 특수문자가 오면 그 문자 자체를 의미 |
(?i)
|
앞 부분에 (?i) 라는 옵션을 넣어주면 대소문자를 구분하지 않음
|
▲ 출처 : http://lng1982.tistory.com/141
이렇게 되시겠습니다.
예제의 ^[0-9]*$ 를 분석해보면
^ 으로 우선 패턴의 시작을 알립니다.
[0-9] 괄호사이에 두 숫자를 넣어 범위를 지정해줄 수 있습니다.
* 를 넣으면 글자 수를 상관하지 않고 검사합니다.
$ 으로 패턴의 종료를 알립니다.
즉 , 0부터 9 까지의 수를 글자 수 제한을 하지 않고 검사하는 패턴입니다.
[자주 쓰이는 패턴]
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 Case Sensitive)
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
|
import java.util.regex.Pattern;
public class EngPattern {
public static void main(String[] args) {
String pattern = "^[a-zA-Z]*$";
String input = "ABzzzDAWRAWR";
boolean i = Pattern.matches(pattern, input);
if(i==true)
{
System.out.println(input+"는 패턴에 일치함.");
}
else
{
System.out.println("패턴 일치하지 않음.");
}
}
}
| cs |
패턴분석
^[a-zA-Z]*$
a-z 까지 그리고 A-Z 까지 즉, 알파벳은 모두 허용.
* 글자 수 상관하지 않음
-> 알파벳이기만 하면 패턴에 맞음.
예제3) 파일 확장자 확인 1
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
|
package Pattern;
import java.util.regex.Pattern;
public class ExtendtionPattern {
public static void main(String[] args) {
String pattern = "^\\S+.(?i)(txt|pdf|hwp|xls)$";
String input = "abc.txt";
boolean i = Pattern.matches(pattern, input);
if(i==true)
{
System.out.println(input+"는 패턴에 일치함.");
}
else
{
System.out.println("패턴 일치하지 않음.");
}
}
}
| cs |
패턴분석
^\\S+.(?i)(txt|pdf|hwp|xls)$
^ : 시작
\ : \ 가 왔기 때문에 다음에 올 문자는 특수문자로 취급하고 , \다음 특수문자고 오면 그 자체로 취급.
\S : 공백 아닌 문자
+. : .이 반드시 한개는 와야한다.
(?i) : 대소문자 구별하지 않음.
(txt|pdf|hwp|xls) : txt 혹은 pdf 혹은 hwp 혹은 xls 만 허용. | 을 이용한 or 연산!
$ : 끝
-> 공백아닌 문자와 .이 반드시 와야하고 뒤에는 txt, pdf, hwp, xls 만 허용.
예제4) 파일 확장자 1, 2
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
32
33
|
import java.util.regex.Pattern;
public class extensionPattern {
public static void main(String[] args) {
String pattern = "^\\S+.(?i)(txt|pdf|hwp|xls)$";
String input = "Java.pdf";
String pattern2 = "(.+?)((\\.tar)?\\.gz)$";
String input2 = "library.tar.gz";
vaildPattern(pattern, input);
vaildPattern(pattern2, input2);
}
public static void vaildPattern(String pattern, String input)
{
boolean i = Pattern.matches(pattern, input);
if(i==true)
{
System.out.println(input+"는 패턴에 일치함.");
}
else
{
System.out.println("패턴 일치하지 않음.");
}
}
}
| cs |
출처: http://highcode.tistory.com/6 [HighCode]
댓글
댓글 쓰기