사랑해 마니마니

정규표현식(작성 중) 본문

java

정규표현식(작성 중)

분리불안증후군 2019. 4. 28. 00:41

Search

  • 문자열에서 문자를 찾을 때는 매칭되는 전체 문자를 찾는다. 예를 들어 Hello, World! Hello, Home 에서 Hello로 검색하면 2개의 Hello가 검색된다
  • Case sensitive라서 대소문자를 가린다.

Anchor(위치), escaping

정규 표현식은 대소문자를 가림

^ : 라인의 시작. ^who는 문자열의 맨처음에 나타나는 who를 찾음.

  • who is who에서 ^로 검색하면 처음 who만 검색됨

$ : 라인의 끝. who$는 문장의 맨 끝에 나타나는 who를 찾음.

  • who is who에서 who$로 검색하면 마지막 who만 검색됨

\ : escape. 만약 문자열에 $이나 ^ 또는 \가 있는 경우 이 문자를 찾고자 할 때는 \$, \^, \\를 입력해야 함.

  • $12$ \-\ $12$에서 맨 처음 나오는 $를 검색하려면 ^$가 아니라 ^\$로 검색해야함
  • 제일 뒷쪽의 $를 검색하려면 \$$로 검색

모든 문자

. : 문자 하나. 동작하는 방식이 특이한 데 .는 문자 한개 단위로 전체 문자열을 검색하여 문자열 전체가 검색됨.

  • 그런데 ... 는 문자 3개 단위로 검색함. 그래서 문자가  7개로 이루어진 문자열의 경우 문자 3개 단위로 검색하여 앞에 6개만 선택됨(마지막 1개 문자는 3개 문자 단위로 검색하기 때문에 갯수에서 제외됨)
  • '.' 으로 검색하려면 escape시켜야 함. OK. There is에서 '.' 을 검색하려면 \.으로 검색

특정 문자 리스트

[...] : square brackets, [ ]는 문자 하나를 나타내며, 여러 개의 문자를 넣을 경우 'or'의 의미.

  • 그래서 [dH]는  'd' or 'H' 한개의 문자를 나타냄

[-] : '-'는 range(A부터 B까지)를 나타냄.

  • [2-6][23456]과 같은 의미
  • 대소문자 전체는 [a-zA-Z] 로도 나타낼 수 있음

[^] : [ ]내에서 ^는 not의 의미. ([^ ... ])

  • [^357]not (3,5,7)을 의미함. bracket([...]) 내에서 쓰이는 경우가 아닌 경우 Anchor(위치)지정 자로서 문자열의 처음을 나타냄

Subpattern

( | ) : ( ) 는 그룹 내에 있는 항목을 검색하며 OR를 의미하는 | 와 같이 쓰임. 그래서 (hi|there)는 'hi' or 'there'을 의미함 

Quantifiers (수량)

{n}, {n,}, {n,m} : { } 는 앞에 있는 패턴이 몇번 나타나는지를 나타내며 {n}은 n번, {n,}는 n번 이상, {n,m}은 n번 부터 m까지를 나타낸다. a{3}은 aaa와 같은 의미

* : 앞의 패턴이 0 ~ n번 나타난다. a*는 a가 0 ~ n번 나타난다. {0,}도 같은 의미

+ : 앞의 패턴이 1 ~ n번 나타난다(최소 1번 이상). {1,}도 같은 의미

? : 앞의 패턴이 0 ~ 1번 나타난다. a?b는 aabc에서는 ab, abc에서는 ab, bc에서는 b를 선택할 수 있는 표현식. {0,1}도 같은 의미

  • 그런데 이 수량 연산자들은 탐욕적(greedy)하게 찾는 데 최대한 매칭되는 값을 찾는다.
  • 예를 들어 <div>hi</div><div>there</div> 에서
  • <div>.<div>를 찾는다면 .이 모든 문자열을 찾기 때문에 <div>hi</div><div>there</div>이 검색됨
  •  
    •  
  •  
  • - ?가 수량자 뒤에 나오는 경우 : r.*? 는 앞 수량자 *의 가장 작은 값(그래서 0). r.+?는 1개. r.??는 ?의 최소값 0

    [참조] greedy를 lazy qunitifier로 만들 때 사용함. <div>hi</div><div>there</div>에서 <div>.+</div>를 사용하면 전체가 선택됨(greedy).  <div>.+?</div>를 사용하면 앞쪽만 선택됨(lazy)

 - http://gskinner.com/RegExr/ 에서 한번 해보자

{} : 수량을 좀더 정교하게 하게 지정하기 위함. 앞의 패턴이 몇번 반복될 수 있는가 {n}, {min, max}로 쓸수 있음. 예를 들어 [els]{1,3}은 'e' or 'l' or 's'가 1 ~ 3번 나타날 수 있음. {3,}는 3이상 

Character class(문자 그룹)

\w : word(문자, 숫자, _)를 나타냄(alphabet, number, underline(_)). white space는 제외됨 [A-z0-9_]와 같은 의미

\W : not \n (word가 아니다)

\d : 숫자(digit [0-9])

\D : not \d (digit이 아니다)

\b : word boundary \b\w는 단어의 첫번째 글자. 'word'에서 'w'가 선택됨. \w\b는 마지막 글자. word전체를 선택하려면 \b\w+\b. \b\w\b는 한 단어 글자

\B : \B.을 사용하면 'cat concat'에서 'at'가 선택됨. (word boundary에서 첫번째 글자가 아닌 것)

\A : 문장 전체의 처음(cf. ^은 multi line의 경우 매 라인의 시작점을 의미) 

\Z : 문장 전체의 맨 마지막(cf. $는 muli line의 경우 매 라인의 마지막을 의미)

egular Expression Description

\d

Any digit, short for [0-9]

\D

A non-digit, short for [^0-9]

\s

A whitespace character, short for [ \t\n\x0b\r\f]

\S

A non-whitespace character, short for

\w

A word character, short for [a-zA-Z_0-9]

\W

A non-word character [^\w]

\S+

Several non-whitespace characters

\b

Matches a word boundary where a word character is [a-zA-Z0-9_]

Assertions

(?=X) : X를 기준으로 선택하는 데 X는 제외함. \w+(?=X)는 AAAX에서 AAA만 선택하고 X는 제외함

 

 

 

 

 

'java' 카테고리의 다른 글

Java 정규 표현식  (0) 2019.05.01
Comparator  (0) 2018.01.29
java array를 list로, list를 array로 바꾸기  (1) 2018.01.29
Java Lambda 식에서 자주 사용하는 스트림 명령들(1)  (0) 2018.01.09
Comments