본문 바로가기
카테고리 없음

손에 잡히는 정규표현식

by java개발자 2016. 8. 16.

정규식 : 검색 + 치환


정리


 

 


 

 

 2장 문자 하나 찾기

 

 .

 모든 문자 1개

 \r이나 \n은 해당사항 없음

 

 

\.

 마침표(.) 

 역슬래시

 3장 문자 집합으로 찾기

 

 [] 

 문자집합(집합내에 1개만 사용됨)

 

 

 

 [a-z]

 a부터z까지 범위 정할때 하이픈 사용 

 하이픈(-)은 대괄호[]내에서만 메타문자이다.대괄호 밖에서는 그냥 문자임.

 

 

 [0-9]

 [0123456789] 

 

 

 

 [^0-9]

 집합을 제외하고 찾기

 대괄호[] 안에서 효과

 4장 메타 문자

 

 \

 이스케이프 

 

 

 

 \\

 문자(\)를 표시 

 


공백메타문자

 [\b] 

 역스페이스

 

 

  \f

 페이지넘김(form feed)

 

 

  \n

 줄바꿈

 

 

  \r 캐리지 리턴 

 

  \t

 탭

 

 

  \v

 수직 탭

 

 

 숫자

 \d

 숫자 하나 [0-9]

 

 

  \D 숫자 제외한 문자 하나 [^0-9],
 당연히 \r\n같은 것은 제외
 

 

 문자 \w [a-zA-Z0-9_] 밑줄과 영숫자 

 

  \W [^a-zA-Z0-9_]

 한글, 공백, ., ;, (, ), -, 등등등 

 생각외로 굉장히 많다.

 \r\n 도 포함

 

 공백 \s

 [\f\n\r\t\v] 모든 공백 문자와 같다.([\b]는 포함 하지 않음)

 

 

 

 \S

 [^\f\n\r\t\v] 

 

 16진수

 \x0A

 16진수 (아스키문자 10 = \n)

 

 

 8진수 \011

 8진수 (아스키문자 9 = \t)

 

 

 

 \c

 컨트롤키 문자(쓸일이 거의 없다)

 \cZ = Ctrl+Z

 

5장 반복 찾기 

 탐욕적 수량자 + 1개 이상 {1, }

 

 

 [\w.]+

 [a-zA-Z0-9_.] 마침표와 밑줄을 포함한 영숫자 1개 이상

 

 

  * 0개 또는 1개 이상 

 이론상 {0, } 와 같지만

 실제로 {0, } 로 찾아지지는 않는다.

 

  ? 0개 또는 1개 

 이론상 {0, 1} 와 같지만

 실제로 {0, 1} 로 찾아지지는 않는다. 왜그러지???

 

  http[s]?://https:// 또는 http://  

 

 구간

 {6}  문자 6개 

 

  \d{6} \d\d\d\d\d\d 

 

  \d{1,2}

 \d 또는 \d\d

 

 

 

 \d{3, }

 \d\d\d 또는 \d\d\d\d\d\d.....등등등

 최소 3개

 

 

 게으른 수량자

 +?

 최소한 일치하는 경우

 

 

  *? 최소한 일치하는 경우

이메일 주소를 찾을때
 \w*@ 는 탐욕적이 아닌데,

 .*@ 는 탐욕적이다 

 .*?@를 사용해야 한다.

 

 

 {n, }

 최소한 일치하는 경우 

6장 위치 찾기 

 경계

 \b

 \w과 \W(\w외 모든 문자) 사이에 있는 위치

 
   \B

 \w과 \w 또는 \W과 \W 사이에 있는 위치

 
  

 \babc\b

 Enter abc words (주로 공백사이의 단어)

 "abc"

 'abc'

 -abc-

 .abc.

 (abc)

 +abc+

 <abc>

 [abc]

 *abc*

 #abc#

 !abc!

 abc가 \w이므로

 반대인 \W로 둘러쌓은 경우를 찾는다.
 

   \b-\b end-start -가 \W이므로
 반대인 \w로 둘러쌓인 경우를 찾는다.
  

 \Babc\B

 kkkabckkk

 _abc_

 abc가 \w이므로

 같은 \w로 둘러쌓은 경우를 찾는다.

   \B-\B end - start -가 \W이므로

 같은\W으로 둘러쌓인 경우를 찾는다

  문자열시작 ^ ^\s*<\?xml.*\?> \A도 같은 기능(이클립스는 동작하지 않음)
  문자열끝 $

 </[Hh][Tt][Mm][Ll]>\s*$

 \Z도 같은 기능(이클립스는 동작하지 않음)
 

 다중행

 (?m)

 (?m)^\s*//.*$

 (?m)은 항상 패턴 앞에 두어야 한다.

 (?m)다중행모드로 변경하면, 정규 표현식 엔진이 줄바꿈문자를 문자열 구분자로 인식한다.

 캐럿(^), 달러($) 기호의 동작을 변경한다.


 (?m)을 지원하지 않는 정규식도 많다.

 7장 하위 표현식 사용

  ( )

 &nbsp;&nbsp; 를 찾고자 할때

 (&nbsp;){2, }

IP 1.255.255.255인 경우
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

이지만

(\d{1,3}\.){3}\d{1,3}

으로 할 수도 있다.(완벽하진 않음)

> 성능문제가 발생할 수도 있다.

   |

 OR : 왼쪽 혹은 오른쪽

 1967-08-17에서 1967을 찾기 위해

19|20\d{2} 로 찾으면 19만 찾고

(19|20)\d{2} 로 찾아야 1967 모두 찾을 수 있다.

8장 역참조 사용하기

  \1

 반복되는 단어 찾기
 [ ]+(\w+)[ ]+\1


of of,  and and , , are are....

 역참조는 참조하는 표현식이 하위 표현식일때,

그리고 하위 표현식을 괄호( )로 감쌌을때 만 동작한다.

   

( ) 로 감싼 부분만 \1로 가져올 수 있다.

\1 : 첫번째,  \2 : 두번째, \3 \4 \5...

\0은 표현식 전체..

 
   

 짝이 맞는 <h1>, <h2> 태그 찾기

<[hH]([1-6])>.*?</[hH]\1>

 
  치환 $1

이메일주소에 하이퍼링크 걸기

1.이메일주소 찾기 : (\w+[\w\.]*@[\w\.]+\.\w+)

2.치환 : <a href="mailto:$1">$1</a>

 
 

 치환할때 대소문자 변환

 \l

 다음에 오는 글자를 소문자로 변환

 이클립스에서는 작동 안함.
   \u

 다음에 오는 글자를 대문자로 변환

 이클립스에서는 작동 안함.

   \L

 \E를 만날때까지 모든 문자를 소문자로 변환

 이클립스에서는 작동 안함.

  

 \U

 \E를 만날때까지 모든 문자를 대문자로 변환

 이클립스에서는 작동 안함.

   \E

 \L, \U변환의 끝을 나타냄.

 이클립스에서는 작동 안함.

   

 <h1>abc</h1> h1태그 사이의 문자를 대문자로 변경하기

찾기 : (<[Hh]1>)(.*?)(</[Hh]1>)

치환 : $1\U$2$3

 이클립스에서는 작동 안함.

 9장 전방탐색과 후방탐색

  

 <title>ABC</title> 에서 ABC만 추출하고 싶다면?


 
  전방탐색
->
 ?=

전방탐색은 일치 영역을 발견해도 그 값을 반환하지 않는 패턴


 
   

 .+(?=:)
http://

https://


에서 http, https 만 가져온다. (:)를 제외한다.

 
  후방탐색
<-
?<= 

 (?<=\$)[0-9.]+


1: $23.45

2: $5.31

에서 다음 추출

23.45

5.32

 
  전방후방 함께 

 (?<=<[tT][iI][tT][lL][eE]>).*(?=</[tT][iI][tT][lL][eE]>)


<Title>이부분찾아줌</Title>

 
  부정형 전후방   
  부정 전방

 ?!

 \b(?<!\$)\d+\b

달러가 없는 숫자 단어

 
  부정 후방

 ?<!

  

 10장 조건달기

 

 역참조 

 ?(1)true

 (<[aA]\s+[^>]+>\s*)?

<[iI][mM][gG]\s+[^>]+>

(?(1)\s*</[aA]>)


<a href=""><img src=""></a> 또는

<img src=""> 를 찾아줌

 
  

 역참조

 ?(1)true|false

 (\()?\d{3}
(?(1)\)|-)
\d{3}-\d{4}

123-456-7890
(123)456-7890

 \( 가 있으면 )를 붙이고,

없으면 -를 붙인다.

  

 전후방탐색


 ?(?=검색어)true

 \d{5}(?(?=-)-\d{4})

 왼쪽에서부터 \d{5} 를 찾고

 전방탐색 (?=-) 를 만족하면

 - 를 제외하고 계속 진행

 -\d{4} 를 찾음

     
     



정규식을 그래프로 보기(https://regexper.com/)



IP 정규식으로

출처 : http://www.moneybook.co.kr/pages/543430

^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$


풀어서 나타내면,,,

^

(

(

[0-9] | [1-9][0-9] | 1[0-9]{2} | 2[0-4][0-9] | 25[0-5] 

)

\.

){3}

(

[0-9] | [1-9][0-9] | 1[0-9]{2} | 2[0-4][0-9] | 25[0-5]

)

$