'Regular Expression'에 해당되는 글 4건

  1. 2013.05.12 구간 지정
  2. 2013.05.12 반복 찾기(+, *) 와 '?' 메타 문자
  3. 2013.02.07 [Python] Regular Expression
  4. 2013.02.03 URL 교체하기

구간 지정

Programming/RegEx 2013. 5. 12. 21:46 |


구간 지정하기

더하기, 별표, 물음표는 정규 표현식을 쓰면서 발생하는 많은 문제를 해결해 주지만, 충분하지 않을 때도 있다. 다음과 같은 상황을 생각해 보자.

# 더하기와 별표는 일치하는 문자 수에 제한이 없다. 문자가 최대 몇 개까지 일치하는지 정할 수 없다.

# 더하기, 별표, 물음표가 일치하는 문자 수의 최솟값을 0이나 1이다. 일치하는 문자 수의 최솟값을 명시적으로 정의할 수 없다.

# 정확히 원하는 만큼만 일치하도록 문자 수를 정의할 수 없다.


이런 문제들을 해결하고, 연속하는 문자를 찾을 때 검색 조건을 더 구체적으로 지정하고자 정규 표현식에서는 구간을 사용한다.

구간은 중괄호([]) 안에 표시한다.



정확한 구간 찾기

문자가 일치하는 수를 정확히 정하려면 여는 중괄호와 닫는 중괄호 사이에 숫자를 넣는다. 즉 {3} 은 바로 앞에 있는 문자나 문자 집합이 세 번 연속해서 일치하는지 확인한다. 만약 요소가 두 개만 있다면, 패턴이 일치하지 않는다.

RegEx: 

16진수 여섯개가 일치하는 것을 검색



범위 구간 찾기

일치시키려는 요소 수의 최솟값과 최댓값을 나타낼 때도 구간을 사용한다. 범위는  {2,4} 처럼 표현한다. 최소 두 번에서 초대 네 번까지 일치시킨다는 의미이다.

RegEx: 

이 예제에서 쓴 정규식은 슬래시(/) 문자를 \/ 로 이스케이프 하였다. 많은 정규식 구현에서는 이 작업이 필요 없지만, 어떤 정규 표현식 해석기에는 필요하다. 

따라서 상 슬래시(/) 를 이스케이프 하는 편이 좋다.


※ 구간은 0부터 시작하기도 한다. {0,3} 은 요소가 없는 경우나 요소가 한 번 또는 두 번이나 세 번 일치함을 의미한다.

물음표(?)는 물음표 앞에 주어진 요소가 없는 경우나 요소 한개와 일치한다. 즉, 물음표(?) 는 {0,1} 과 같은 기능을 한다.



최소 구간 찾기

예를 들어 {3,} 은 최소한 요소가 세 번 일치함을 의미한다. 

RegEx: 


※ 더하기(+) 는 {1,} 과 기능이 같다.


'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
:


문자 하나 이상 찾기

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

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
:



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

정규 표현식(Regualr Expression)  (0) 2013.05.05
태그 찾기  (0) 2013.02.12
URL 교체하기  (0) 2013.02.03
정규 표현식의 활용(이메일 주소 변경)  (0) 2013.02.03
POSIX 정규 표현식  (0) 2013.02.03
Posted by scii
:

URL 교체하기

Programming/RegEx 2013. 2. 3. 21:53 |

http:로 시작하는 URL을 <a href="URL">URL</a> 로 교체하기


이 작업을 하려면 우선적으로 URL 주소만을 찾는 정규 표현식 패턴을 만드는 것이 첫 번째로 할 일이다.

다음으로, 검색 결과를 백레퍼런스로 사용해서 교체한다. 


원본   


URL을 검색하는 정규 표현식


검색된 URL


URL을 다른 형식으로 바꿔주고 있다.


바뀐 최종적인 URL


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

정규 표현식(Regualr Expression)  (0) 2013.05.05
태그 찾기  (0) 2013.02.12
[Python] Regular Expression  (0) 2013.02.07
정규 표현식의 활용(이메일 주소 변경)  (0) 2013.02.03
POSIX 정규 표현식  (0) 2013.02.03
Posted by scii
: