본문 바로가기

정규표현

[제5장] 정규표현 정리 (심화 1 )

1.최장매치 ,최단매치 문제 

O*?,O+?


 次の例文で、「"●●●"」のように2つのダブルクォートに文字列が囲まれている部分にマッチする正規表現を書いてみましょう。

 沖縄の方言で"あしびなー"とは"遊び場"のことです。

해답 :" .*? "


-특정 문자열을 표현하는 표현식은 .* 이다.


최장매치

최단매치 

 *

 *?

 +

+? 

 ?

 ??

 {n}

 {n}?

 {n,}

 {n,}?

 {n,m}

 {n,m}?


예를 들어 첫번째 문제에서 더블쿼터에 포함되는 1문자 이상의 문자열을 지정하기위해 다음의 정규표현을 매치시킨다.


".+?"


2.캡쳐 사용


次の例文で、[  1  ]の部分と[  2  ]の部分がまったく同じ文字列(ただし1文字以上)である場合のみマッチする正規表現を書いてみましょう。この[  1  ]はとてもおいしい[  2  ]だ。


해답 : この(.+)はとてもおいしい\1だ。


-먼저 한문자이상의 문자열 이라 말하고 있기에 다음 처리를 먼저 진행한다.

  다음매치한 문자와 같은 것이 \1의 부분이기 때문에 , \1로 매치해주면 된다.

 

원리로서는 정규표현엔진은 먼저 ¥w를 찾기시작한다. 



3.2회이상의캡처를 사용한다.


次の例文で、[  1  ]の部分と[  4  ]の部分、[  2  ]の部分と[  3  ]の部分が、それぞれ同じ1文字以上の英単語である場合のみマッチする正規表現を書いてみましょう。

  <[  1  ]><[  2  ]>Gihyo.jp</[  3  ]></[  4  ]> 


해답 : <(\w+)><(\w+)>.*</\2></\1>


2개이상의 캡처를 이용하고자 할 때 , 앞서서 설명한 ¥1을 이어서 사용하면 된다. ¥2,¥3 식으로 


(¥w+) - (¥d+) ¥1 ¥2 일때

¥1에는 처음의 (¥w+) 부분이 ,¥2 부분에는 (¥d+)의 부분으로 캡쳐된 부분이 들어간다.


Year-2010 Year 2010의 문제에서는


<1><2>Gihyo.jp</3></4>


<(¥w+)><(¥w+)>.*</¥2></¥1>인데 다음의 정규표현은 어떻게 문자열에 매치할 수 있을까!! 요 


abcXYZ 1234 abcXYS XYZ 1234

(abc(¥w+))(¥d) ¥1 ¥2 ¥3



4. 캡처하지않고 그룹화 

(?: OOO)



次の例文で、[  1  ]と[  5  ]および[  3  ]と[  4  ]の部分が、それぞれ同じ1文字以上の英単語である文字列にマッチする正規表現を書いてみましょう。なお、[  2  ]は0文字以上の英単語で、かつ「id="[  2  ]"」の部分は省略でき、「id=…」の前には空白文字が1つ入るものとします。

<[  1  ] id="[  2  ]"><[  3  ]>技術評論社</[  4  ]></[  5  ]>


해답 : <(\w)+(?:\sid="\w*")?><(\w+)>技術評論社</\2></\1>


만약 여기서 끝나지 않고 <> 안에 id = "" 형식으로 들어가있는 상황이라면

정규표현은

¥sid="¥w*" 


게다가 이 부분에는 생략이가능하기에 [0회 이거나 1회 출현한다]라는 조건을 찾는 [?]을 사용한다.

(¥sid="¥w*")?


<(\w)+(?:\sid="\w*")?><(\w+)>技術評論社</\2></\1>  요로케!

이걸로 완성된 것이 아니다 .

방금 전의 예에서 캐릭터 그룹화를 목적으로 ( ) 를 사용하는데, ( ) 를 사용한 그룹화에는 자동적으로 캡처를 실행시키는 성질이 있다.

본래는 ¥2에 2번째의 캡처가 매치되어 문자열에 들어가는데

실제는 (?:\sid="\w*")? 에 매치되어버린다/ 두번째의 ¥w+에 매치되는 내용은 ¥3이니까 주의하자. 




5.먼저 읽혀지기 

(?= OOO )

   次の例文で、後ろに「年」が続く1桁以上の数字にのみマッチする正規表現を書いてみましょう。太郎は昭和54年生まれの30歳であり、太郎の父は昭和25年生まれの59歳である。 


해답 :\d+(?=年) 

¥d는 수치가 나올때까지 계속 찾는 역할을 하고 

뒤의 (?=年)  녀석이 등장하는 위치를 반환 해 준다.


차례차례 하나하나 생각을 해보자 .

¥d + 年 을 하게되면  54과 59이라는 결과가 나온다.


이때 먼저읽는 형식인 (?=OOO)을 사용해보겠다.

OOO부분에 정규표현 하고자 하는 부분을 넣어주고 찾으면 된다.


¥d+(?=年) 


먼저 읽어들이기는 지정한 문자열 그 상태가아니라, 매치한 문자열이 있는 위치! 이다.


6.부정선독 (否定先読みを使う)

(?! OOO) 



次の例文で、後ろに「年」および数字以外の文字が続く1桁以上の数字にマッチする正規表現を書いてみましょう。

  太郎は昭和54年生まれの30歳であり、太郎の父は昭和25年生まれの59歳である。


해답 : ¥d+(?![年¥d])


이것은 지정된 조건에 매치하지 않는 문자열의 앞 부분에 있는 문자열을 찾는 문제.


OOO에 조건이되는 정규표현을 넣고 이 조건에 매치하지않는 문자열의 위치를 찾는 것이 부정선독이다.

숫자이외의 문자이기때문에 이렇게 먼저 쓰고 시작한다.

(?![年¥d])


이 앞의 1행이상의 숫자를 매치하는 대상을 찾고싶기때문에 전체 정규표현을 표현 

¥d+(?![年¥d])

이것을  ¥d+[^年¥d]  이렇게 표현하면 잘못된 결과가 나온다.

30歳 /59


7. 후독을 사용하자 (後読を使う

(?<=OOO)


次の例文で、「昭和」または「平成」に続く1桁以上の数字にのみマッチする正規表現を書いてみましょう。

  西暦2010年は平成22年です。西暦1980年は昭和55年です。


해답 : (? <= 昭和/平成)¥d+ 


후독 (뒤부터 읽기) 은 지정된 조건에 걔속하는 문자열에 매치시키고싶을때 쓰는 패턴.


(?<=Hoge)Piyo 의 형식으로 매치한다.

FugaPiyo 였을때 piyo에는 매치시키지 않는다.


8.부정후독(否定後読みを使う)을 사용하자

 (?<! OOO )


   次の例文で、「昭和」および「平成」、数字以外の文字に続く1桁以上の数字にマッチする正規表現を書いてみましょう。

西暦2010年は平成22年です。西暦1980年は昭和55年です。


해답 (?<!昭和|平成|¥d)¥d+ 


지정한 조건에 매치하지않는 문자열의 뒤에있는 문자열을 찾는 문제다.



'정규표현' 카테고리의 다른 글

더 잘 정리된 정규표현 기본문법  (0) 2015.05.28
Regular Expression 기본문법  (0) 2015.05.28