728x90
반응형
정규식은 모든 프로그램 언어에 자주 사용되는 문자처리 기법(?) 이다.
정규식의 내용은 대부분 비슷하기 때문에
Java 언어를 기반으로 기초 적인 방법을 공유하려고 한다.
나머지는 각 언어에 맞게 찾아 보시길...
1. 정규식
리터럴([]) 범위 지정 : [0-9] - 숫자, [a-z] - 소문자, [a-zA-Z] 알파벳
리터럴(.)모든 범위 문자
리터럴* : 해당 리터럴이 0번 이상 반복
리터럴+ : 해당 리터럴이 1번 이상 반복(반드시 1번은 나옴)
^리터럴 : 리터럴 조건이 만족하지 않음
리터럴|리터럴 : 택1
리터럴{숫자} : 숫자만큼 반복
(리터럴) : 리터럴 그룹화, 그룹된 리터럴은 Macher 클래스의 인스턴스 메소드 group(int i)호출을 통해 그룹단위로 얻을 수 있다.
ex1)[b|c].*{7} : b 또는 c로 시작하는 8자리 문자열
ex2)c.*d : c로 시작하고 d로 끝나는 문자열
ex3)전화번호 정규식 : (0\d{1,2})-(\d{3,4})-(\d{4})
sample1)
String ptn = "(0\\d{1,2})-(\\d{3,4})-(\\d{4});
Pattern p = Pattern.compile(ptn);
Matcher m = p.matcher("012-1234-5678");
if( m.find() )
System.out.println( m.group() + "has" + m.group(1) + ", " + m.group(2) + ", " + m.group(3) );
sample2)
public static boolean find(String a)
{
boolean result = true;
String ptn = "(.*union.*)|(.*from.*)|(.*select.*)|(.*where.*)|(.*insert.*)|(.*declare.*)|(.*drop.*)|(.*user_tables.*)|(.*substr.*)";//문자 정규식1
ptn += "|(.*update.*)|(.*openrowset.*)|(.*and.*)|(.*or.*)|(.*sysobject.*)|(.*if.*)|(.*syscolumns.*)|(.*join.*)|(.*substring.*)";//문자 정규식2
ptn += "|(.*/.*)|(.*=.*)|(.*#.*)|(.*>.*)|(.*<.*)|(.*‘.*)|(.*“.*)|(.*[*].*)|(.*[-].*)|(.*[+].*)|(.*\\(.*)|(.*\\).*)";//특수 문자
ptn += "|(.*column\\_name.*)|(.*table\\_name.*)|(.*user\\_table\\_columns.*)|(.*xp\\_.*)";//문자 특수 문자 조합
Pattern p = Pattern.compile(ptn);
Matcher m = p.matcher(a);
try
{
for( int i = 0; i < m.regionEnd(); i++)
{
if( m.find() )
{
System.out.println(m.toString());
result = false;
}
}
}
finally
{
return result;
}
String ptn = "(.*union.*)|(.*from.*)|(.*select.*)|(.*where.*)|(.*insert.*)|(.*declare.*)|(.*drop.*)|(.*user_tables.*)|(.*substr.*)";//문자 정규식1
ptn += "|(.*update.*)|(.*openrowset.*)|(.*and.*)|(.*or.*)|(.*sysobject.*)|(.*if.*)|(.*syscolumns.*)|(.*join.*)|(.*substring.*)";//문자 정규식2
ptn += "|(.*/.*)|(.*=.*)|(.*#.*)|(.*>.*)|(.*<.*)|(.*‘.*)|(.*“.*)|(.*[*].*)|(.*[-].*)|(.*[+].*)|(.*\\(.*)|(.*\\).*)";//특수 문자
ptn += "|(.*column\\_name.*)|(.*table\\_name.*)|(.*user\\_table\\_columns.*)|(.*xp\\_.*)";//문자 특수 문자 조합
Pattern p = Pattern.compile(ptn);
Matcher m = p.matcher(a);
try
{
for( int i = 0; i < m.regionEnd(); i++)
{
if( m.find() )
{
System.out.println(m.toString());
result = false;
}
}
}
finally
{
return result;
}
}
1.정규식 표현 종류 (메타문자)
1)^
괄호안의 형식을 제외한다는 의미.
-[^0-9] : 0~9를 제외한 나머지 메타문자.
-^[0-9] : ^ 이게 괄호 앞에 붙으면 시작을 의미한다. 0~9로 시작하는 메타문자인 셈.
2)$
문자열의 끝을 의미
-b$ : b로 끝나는 문자를 의미.
3)\
메타문자를 표현하기 위한 명령
+,.,? 등을 표현할때 쓰는 백슬러쉬.
-ab\.com : ab.com을 표현하기 위해 쓰임
4).
임의의 한문자
-a.c : abc, acc
5)*
앞 글자의 없거나 하나 이상의 문자
-a*b : b, ab, bbbbbbb
6)+
앞에 문자가 하나이상 반복
-a+b : aaaaaaaaaaaaaaaaaaaab
7){}
숫자에 따른 반복 갯수
-ab{3} : ababab
8)|
or
-a|b|c : a또는 b또는 c
9)()
묶음, 걍 묶어주는 역할
10) []
괄호안의 형식 일치
-[ab] : a, b, ab 3가지 형식이 다일치.
11)?
앞의 문자가 존재하거나 존재하지 않는다. *랑 비슷한 느낌인데 흠.
-xx? : x, xx
괄호안의 형식을 제외한다는 의미.
-[^0-9] : 0~9를 제외한 나머지 메타문자.
-^[0-9] : ^ 이게 괄호 앞에 붙으면 시작을 의미한다. 0~9로 시작하는 메타문자인 셈.
2)$
문자열의 끝을 의미
-b$ : b로 끝나는 문자를 의미.
3)\
메타문자를 표현하기 위한 명령
+,.,? 등을 표현할때 쓰는 백슬러쉬.
-ab\.com : ab.com을 표현하기 위해 쓰임
4).
임의의 한문자
-a.c : abc, acc
5)*
앞 글자의 없거나 하나 이상의 문자
-a*b : b, ab, bbbbbbb
6)+
앞에 문자가 하나이상 반복
-a+b : aaaaaaaaaaaaaaaaaaaab
7){}
숫자에 따른 반복 갯수
-ab{3} : ababab
8)|
or
-a|b|c : a또는 b또는 c
9)()
묶음, 걍 묶어주는 역할
10) []
괄호안의 형식 일치
-[ab] : a, b, ab 3가지 형식이 다일치.
11)?
앞의 문자가 존재하거나 존재하지 않는다. *랑 비슷한 느낌인데 흠.
-xx? : x, xx
2.정규식 표현종류 (이스케이프)
1)\d : [0-9]
2)\D : [^0-9]
3)\s 는 스트링인가? 큼.
2)\D : [^0-9]
3)\s 는 스트링인가? 큼.
특수문자는 아래와 같이 처리.
[]으로 싸줘야하는 문자
* → [*]
+ → [+]
$ → [$]
| → [|]
\\ 추가 해야하는 문자
( → \\(
) → \\)
{ → \\{
} → \\}
^ → \\^
[ → \\[
] → \\]
무관한 특수 문자
! # % & @ ` : ; - . < > , ~ ' "
추가로
.*? 와ㅏ .*의 차이는
?를 붙이면 최소로 만족하는 문자란 뜻이다.
syysyyyyyyyyyyys에서
s.*?s는 syys
s.*s는 syysyyyyyyyyyyys
* → [*]
+ → [+]
$ → [$]
| → [|]
\\ 추가 해야하는 문자
( → \\(
) → \\)
{ → \\{
} → \\}
^ → \\^
[ → \\[
] → \\]
무관한 특수 문자
! # % & @ ` : ; - . < > , ~ ' "
추가로
.*? 와ㅏ .*의 차이는
?를 붙이면 최소로 만족하는 문자란 뜻이다.
syysyyyyyyyyyyys에서
s.*?s는 syys
s.*s는 syysyyyyyyyyyyys
2. 비교 연산
if( A==B )
문자열 if( A.equals(B) ) 함수
타입 if( A instanceof B )
3. 데이터 타입 가져오기
public class instanceOf{
public static void main(String[] args)
{
Object str = new instanceOf();
if ( str instanceof String )
{
System.out.println("String");
}
else if( str instanceof Integer )
{
System.out.println("Integer");
}
else if( str instanceof Object )
{
System.out.println("Object");
}
}
}
public static void main(String[] args)
{
Object str = new instanceOf();
if ( str instanceof String )
{
System.out.println("String");
}
else if( str instanceof Integer )
{
System.out.println("Integer");
}
else if( str instanceof Object )
{
System.out.println("Object");
}
}
}
반응형
LIST
'전공 > 실무' 카테고리의 다른 글
IAP 연동가능한 Node.JS 서버 라이브러리 (0) | 2018.04.13 |
---|---|
Java 암호화 (0) | 2018.04.12 |
[Linux] CentOS 리눅스 명령어 (0) | 2018.04.12 |
[Nodejs] 난독화, 복호화(암호화) (0) | 2018.04.12 |
[Nodejs] 소켓(socket.io) 연동 (0) | 2018.04.03 |