[프로그래밍언어][공통] 정규 표현식 ( Regex : Regular Expression )

728x90

 

<  정규 표현식  >

 

 :  복잡한 문자열 패턴을 정의하는 문자 표현 공식  ( => 특정한 규칙을 가진 문자열의 집합을 추출 )

 

문자
x 문자 x
( 문자 하나를 의미 )
\ \ 백슬래시(\) 문자
( 백슬래시 다음에 오는 문자가 특수문자일 경우 그 문자 자체를 의미
ex)  in Java
  \\?  →  ? (물음표)
  \\@    @ (골뱅이)
  \\^    ^ (캐럿)
  \\\\    \ (백슬래시)
  \'    ' (작은 따옴표)  -- 
Escape Sequence
  \"    " (큰 따옴표)  --  Escape Sequence 
)

(  이스케이프 시퀀스 ( Escape Sequence )  https://hyunjiishailey.tistory.com/502 )

 

문자 클래스  
[ a b c ] 문자 a, b, c 중 한 문자
[ ^ a b c ] 문자 a, b, c를 제외한 모든 문자
( '[ ]' 안에 있는 '^'는 부정( not ) 연산자 )
[ a - z A - Z ] 문자 a ~ z, A ~ Z  ( 알파벳 )
( '-' 는 범위 지정 시 사용 )

 

우선순위 이름 예시
1 특수문자 \ x
2 그룹화 문자 [ . . . ]
3 범위 a - z
4 합집합 [ a - e ] [ i - u ]
5 교집합 [ a - z && [ a e i o u ] ]

 

미리 정의된 문자 클래스  
. 임의의 한 문자
( 줄바꿈 문자 '\n' 등을 제외한 모든 문자 )
( [ ] 안에 쓰일 경우 '.' (Dot) 의미 )
\ d 숫자
( [ 0 - 9 ] 와 같음 )
\ D 숫자가 아닌 문자
( [ ^ 0 - 9 ] )
\ s 공백 문자
( [ \ t \ n \ x 0 B \ f \ r ] )
\ S 공백이 아닌 문자
( [ ^ \ s ] )
\ w 단어 문자
( [ a - z A - Z _ 0 - 9 ] )
\ W 단어가 아닌 문자
( [ ^ \ w ] )

 

경계 일치자  
X 문자열의 시작
( 뒤에 올 문자로 시작해야 함 )
X  $ 문자열의 끝
( 앞에 올 문자로 끝나야 함 )

 

수량사  
X  ? 0회 또는 1회
( ex) ab?c  ☞  abc, ac 등 )
X  * 0회 이상
( ex) ab*  ☞  a, ab, abb, abbb, ... 등 )
X  + 1회 이상
( ex) ab+  ☞  ab, abb, abbb, abbbb, ... 등 )
X  { n } n회
X  { n , } n회 이상
( X {0,}  =  X * )
( X {1,}  =  X + )
X  { , m } m회 이하
X  { n , m } n회 이상 m회 이하
X  ? ?
X  * ?
X  + ?
X  { n } ?
X  { n , } ?
X  { n , m } ?
가능한 적게 일치
( 기본적인 수량사는 탐욕적이지만
  '?' 문자가 뒤에 붙으면 탐욕적이지 않은 한정사가 됨 )
( ex)
    <.*>  ☞  <foo><bar>new</bar></foo>
    <.*?>  ☞  <foo>
)

 

논리 연산자  
X Y X 다음 Y
X | Y X 또는 Y
( X ) X 한 그룹  ( 한 그룹으로 인식 )
( ex) a(bc)*  ☞  a, abc, abcbc, ... 등 )
( ex) a(bc)+  ☞  abc, abcbc, abcbcbc, ... 등 )

 

※  Ref Docs

( https://docs.oracle.com/javase/tutorial/essential/regex/index.html )
( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions )
( https://docs.oracle.com/en/database/oracle/oracle-database/19/adfns/regexp.html#GUID-1935FD80-A3CD-413F-BD2E-BBEFE64000B2 )
( https://www.regular-expressions.info/posixbrackets.html )

 


 

<  자바(Java) 예제  >

 

▶  문자열에서 조건에 부합하는 부분 대체  ( String.replaceAll() )

String s; 

// 공백 제거
s = s.replaceAll(" ", "");	// [way 1]
s = s.replaceAll("\s", "");	// [way 2]

// 알파벳 제거
s = s.replaceAll("[a-zA-Z]", "");				// [way 1]
s = s.toUpperCase().replaceAll("[A-Z]", "");	// [way 2]

// 숫자 제거
s = s.replaceAll("[0-9]", "");	// [way 1]
s = s.replaceAll("\\d", "");		// [way 2]

// 특수문자 제거
s = s.replaceAll("[^a-zA-Z0-9]", "");	// [way 1]
s = s.replaceAll("\\W", "");			// [way 2]
s = s.replaceAll("[^\\w]", "");		// [way 3]

// 여러개의 점을 하나로 대체
s = s.replaceAll("\\.+", ".");	// [way 1]
s = s.replaceAll("[.]{2,}", ".")	// [way 2]

▶  문자열에서 조건에 부합하는 부분을 기준으로 나누기 ( String.split() )

String s;
String ss[];

// 한 문자씩 자르기
ss = s.split("");

// 공백 문자를 기준으로 자르기
ss = s.split(" ");		// 공백 하나 [way 1]
ss = s.split("\s");	// 공백 하나 [way 2]
ss = s.split("\s+");	// 공백 여러 개

// 기호를 기준으로 자르기
ss = s.split("\\.");	// 온점 .

( Java String Class  ☞  https://hyunjiishailey.tistory.com/473 )

 

▶  문자열이 조건에 부합하는지 유효성 검사  ( Pattern.matches() )

String s;

// 숫자만
Pattern.matches("^[0-9]+$" , s);					// 1  (^[0-9]+$)
Pattern.matches("^\\d+$" , s);					// 2

// 알파벳만
Pattern.matches("^[a-zA-Z]+$" , s);				// 1
Pattern.matches("^[A-Z]+$" , s.toUpperCase);		// 2

// 알파벳 대문자만
Pattern.matches("^[A-Z]+$" , s);

// 알파벳 소문자만
Pattern.matches("^[a-z]+$" , s);

// 알파벳과 숫자만
Pattern.matches("^[a-zA-Z0-9]+$" , s);		// 1
Pattern.matches("^\\w+$" , s);				// 2

// 한글만
Pattern.matches("^[ㄱ-ㅎㅏ-ㅣ가-힇]+$" , s);

// URL
Pattern.matches("(http(s?)://)[a-z0-9.-:#/?]+" , s);

// 이메일
Pattern.matches("^[a-zA-Z0-9]+@[a-zA-Z0-9._-]+$" , s);

// 전화번호
Pattern.matches("^(010)(-?)[0-9]{3,4}(-?)[0-9]{4}$" , s);

// 주민등록번호
Pattern.matches("^[0-9]{6}(-?)[1-4][0-9]{6}$" , s);

 

▶  문자열에서 조건에 부합하는 부분만 추출  ( Matcher )

String s, regex;

// ex) 핸드폰 번호 추출

s = "010-1234-5678";
regex = "([0-9]+)-([0-9]+)-([0-9]+)";

Matcher m = Pattern.compile(regex).matcher(s);

m.find();
m.group(0);	// 010-1234-5678
m.group(1);	// 010
m.group(2);	// 1234
m.group(3);	// 5678

 


 

 

반응형