'정규 표현식 *'에 해당되는 글 1건

  1. 2013.05.12 반복 찾기(+, *) 와 '?' 메타 문자


문자 하나 이상 찾기

문자나 집합에 속한 요소를 하나 이상 찾으려면 간단히 문자 뒤에 더하기(+) 문자를 붙이면 된다. 더하기(+)는 문자가 하나 이상일 때 일치한다. (최소한 하나와 알치하고, 없을 때는 일치하지 않는다)

a가 a를 찾는 데 반해, a+는 하나 이상 연속된 a를 찾는다. 비슷하게 [0-9] 는 자릿수가 하나인 숫자를 찾는 데 반해, [0-9]+ 는 한 자리 이상 연속된 숫자를 찾는다.


TIP

문자 집합에 더하기(+)를 사용할 때는, 더하기(+)를 집합 바깥에 두어야 한다. 즉 [0-9+] 가 아니라 [0-9]+ 가 맞는 표현이다.

[0-9+] 가 틀린 정규 표현식은 아니지만, 하나 이상의 숫자와 일치하지는 않는다. 더 정학히 말하면 숫자 0부터 9와 더하기(+)로 집합을 정의한 것이고, 따라서 아무 한 자리 숫자나 더하기 기호와 일치하게 된다. 

문법에는 맞지만, 원하는 결과는 아닐 것이다.



현재 블로그에 올리는 예제들은 vim에서 하고 있다. 그래서 본래의 정규식과 이스케이프되야하는 상황이 살짝 다르다. 

이를 테면, 정규식에서는 그냥 + 만 쓰지만, vim에서는 \+ 써야 한다.



이메일 주소를 검색하는 예제

RegEx: 


위의 예제에서 마지막에 \.\w\+ 이 부분을 주의해야 한다. 

이것은, 검색하는 문자열이 맨 마지막에 무조건 .(dot) 다음에 문자가 와야 한다는 것을 명시한 것이다. 저것을 빼면 이메일 주소 마지막에 .(dot) 까지 검색이 된다. 

하지만, 맨 마지막에 위와 같이 명시를 하면 정확히 이메일 주소만 검색을 할 수 있다. 


※ 이 패턴을 보고 집합 안에서는 마침표(.) 를 이스케이프 하지 않아도 마침표와 일치한다는 사실을 알 수 있다. 일반적으로 마침표나 더하기 같은 메타 문자들이 집합의 구성원일 때는 문자 그대로 취급하기 때문에, 굳이 이스케이프 할 필요가 없다. 

그러나 이스케이프 한다고 문제가 생기지는 않는다. [\w.] 는 [\w\.] 와 기능이 같다.




자가 없는 경우나 하나 이상 연속하는 문자 찾기

더하기는 하나 이상 연속된 문자를 찾는다. 문자가 없는 경우는 아예 찾지 못하고, 최소한 하나는 일치해야 한다. 

그래서 있을 수도 있고 없을 수도 있는 문자와 일치시키려면 메타 문자인 별표(*) 를 사용해야 한다.

따라서 B.* Forta 패턴은 B Forta, B. Forta, Ben Forta 같은 조합과 일치한다.


RegEx: 

위와 같은 이메일 주소는 없지만, 가상으로 만들어서 검색을 한 것이다.

맨 처음 \w\+는 처음에 오는 이메일 주소가 유효하고 그다음 . 이 있을 수도 없을 수도 있다는 것이다.




문자가 없거나 하나인 문자 찾기

별표(*) 처럼 물음표(?) 는 문자가 있는 경우 일치하고 문자가 없어도 일치하지만, 별표(*) 와 달리 문자나 집합이 없거나 하나만 있는 경우만 일치하며, 하나 이상은 일치하지 않는다.

즉, 물음표(?) 는 문자 묶음 안에서 있는지 없는지 확실하지 않은 특정한 문자를 하나만 찾을 때 매우 유용하다.


RegEx: 


이 패턴은 https?:// 로 시작한다. 물음표(?)는 자기 앞에 있는 문자가 없거나 그 문자가 하나만 있는 경우 일치한다. 여기서는 s인데, https?:// 는 http:// 나 https:// 와 일치하지만, 그 외에는 일치하지 않는다.


TIP:

집합([]) 은 일반적으로 문자 집합을 정의하는 데 쓰지만, 일부 개발자들은 혼란을 방지하고자 문자가 하나일 때도 집합을 사용한다. 바로 뒤에 나오는 메타 문자가 정확하게 어디에 적용되는지 확실하게 하려는 것이다.

즉, 위의 예제는 아래와 같이 확실하게 명시적으로 쓸 수 있다.

http[s]?://


'Programming > RegEx' 카테고리의 다른 글

Greedy Quantifier & Lazy Quantifier  (0) 2013.05.12
구간 지정  (0) 2013.05.12
포직스(POSIX) 문자 클래스  (0) 2013.05.12
메타 문자 사용  (0) 2013.05.06
문자 집합으로 찾기  (0) 2013.05.06
Posted by scii
: