게시판 본문 ASP, ASP.NET, IIS & Script - Read Only

re: [질문] 아래질문에 이어 ^^ (죄송~)
작성자: 송원석
작성일시: 2003-06-17 23:12,  조회수: 4,180
안녕하세요? 송원석 입니다. ^_^

말씀하신 두 개의 정규 표현식 패턴 모두 약간은 뭐랄까... 좀 미묘한 (?) 결과를 만들어 낼 수도 있는 것들이라고 생각됩니다. ^_^;;;

먼저 두 개중 조금더 간단하다고 생각되는 ( )? 를 먼저 살펴보도록 하겠습니다. 이 패턴을 하나씩 분해해서 살펴보도록 하죠... 먼저   의 의미는 명확하군요. 아마 어떤 웹 페이지의 HTML 을 분석하시는 모양입니다. ^_^

그리고   에 소괄호를 사용하여...

( )

이런 패턴을 만드신 거죠. 여기까지도 명확하게 의미를 파악할 수 있군요... 즉 검색 대상 문자열에서   를 찾기만하는 것이 아니라 부분 매치 문자열로 저장을 해두시려는 의도인 것이리라 생각합니다.

그런데 문제는 그 뒤에 ? 를 붙이시면서 발생합니다. 패턴 중에서도 ? 는 굉장히 특별한 녀석입니다. 제 글의 정규 표현식 패턴의 메타 문자와 해당 메타 문자의 동작을 정리한 표를 보시면 ? 문자에 대한 내용이 다음과 같이 두 번 나오는 것을 보실 수 있습니다.


경우 1.
부분식의 선행 문자를 0 개 또는 한 개 찾는다. 예를 들어, "do(es)?" 는 "do" 또는 "does" 의 "do" 를 찾는다. ? 는 {0,1} 과 같다.

경우 2.
이 문자가 다른 한정 부호(*, +, ?, {n}, {n,}, {n,m})의 바로 뒤에 나올 경우 일치 패턴은 제한적이다. 기본값인 무제한 패턴은 가능한 많은 문자열을 찾는 데 반해 제한적인 패턴은 가능한 적은 문자열을 찾는다. 예를 들어, "oooo" 문자열에서 "o+?" 는 "o" 한 개만 찾고, "o+" 는 모든 "o" 를 찾는다.


잘 생각해 보시면 이 경우엔 경우 1. 에 해당 된다는 것을 아실 수 있으실 겁니다. 그런데 경우 1. 의 설명을 잘 읽어 보십시요. 이와 같은 상태에서 ? 문자는 앞의 문자가 0 개 또는 한 개인 문자열을 찾는 것입니다. 따라서 ( )? 가 의미하는 바는 정말   와 아무것도 존재하지 않는 無 이렇게 두 가지를 찾게 됩니다. 이 부분이 정말 중요합니다. 無 라는 것은 공백 문자도 아니고 그야말로 길이가 0 인 문자열이죠. 따라서 만약 다음과 같은 문자열을 대상으로 정규 표현식 매칭을 찾는다면...

"나의 살던 고향은 꽃피는 산꼴"

아마 테스트를 해보지는 않아서 정확하지는 않지만 글자의 갯수 만큼 매칭 결과가 찾아질 것입니다. 왜냐하면 이 문장에   는 없지만, '나'자와 '의'자 사이에도 길이가 0 인 문자가 하나 있는 셈이고 '의'자와 스페이스 사이에도 길이가 0 인 문자가 하나 있는 셈이며 스페이스와 '살'자 사이에도 공백 문자가 하나 있는 셈이 되는 거죠... 이런식으로 나가다 보면 거의 문장에 있는 글자 수만큼 결과가 리턴될 것입니다.

((?:| )) 도 거의 비슷한 이유로 원치않는 결과를 보이게 됩니다. 우선 소괄호가 중복된 것도 문제라면 문제지만 (?:| ) 부분이 더 큰 문제죠. (?:) 패턴의 경우 부분 일치 문자열을 저장하지 않으면서 괄호를 사용하기 위한 것이므로 이에 대해서는 잠깐 생각하지 않기로 하고 |  에 대해서 집중적으로 살펴 보도록 하겠습니다.

|  를 풀어서 설명을 하면 결과적으로 위의 경우와 완벽하게 일치하게 됩니다. 즉 이 패턴은 길이가 0 인 문자열 또는   를 찾는 것이죠. 역시 이 경우에도 처음의 경우와 똑같은 이유로 검색 대상 문장에 있는 글자 수만큼 결과가 리턴될 것입니다.

만약 의도하시는 바가 공백 문자 (빈칸, 탭 등) 나   를 찾으시려는 것이라면

(?:| )

가 아니라

(?: | ) 또는 (?:\s| ) 를 사용하시는 것이 바람직 합니다. ^_^

감사합니다.

IP 주소: 165.21.154.15
전체 2 건의 댓글이 존재합니다.

신순유

^^ 감사합니다. 그런데 submatched의 item관련해서는 어떻게 될까요? item이 하나 늘게 되는경우가...생기는데요.. 아직 내공부족이라 ㅡㅡ;
2003-06-18 11:50

송원석

죄송하지만 실제 해당 코드를 보여주실 수 있을까요? ^_^;;; 검색 대상이 되는 문자열과 검색하시는 부분을 좀 보면 제가 문제를 이해하는데 도움이 될 것 같습니다. 저도 부족한 부분이 많은지라 코드를 보지 않고선 여러가지 어려움이 많습니다. ^_^;;;
2003-06-18 12:50
전체 2,095 건의 게시물, 84 페이지로 구성된 ASP, ASP.NET, IIS & Script 게시판의 84 페이지입니다.
게시물
30

re: 또 질물을... ^^;

ㅜ.ㅜ

2003-06-25 6,835
29

리턴되는 dataset 을 asp 에서 처리 하기..[문의]

궁금이

2003-06-19 4,540
28

re: 리턴되는 dataset 을 asp 에서 처리 하기..[문의]

송원석

2003-06-20 4,673
27

[질문] 아래질문에 이어 ^^ (죄송~)

신순유

2003-06-17 1,479

re: [질문] 아래질문에 이어 ^^ (죄송~) [2]

송원석

2003-06-17 4,180
25

[질문]콜렉션에 대하여..

신순유

2003-06-16 1,762
24

re: [질문]콜렉션에 대하여.. [2]

송원석

2003-06-16 4,085
23

안녕하세요.. [2]

진진

2003-05-26 1,670
22

re: 안녕하세요.. [1]

송원석

2003-05-27 4,269
21

아크로벳을 asp에서 핸들링 할수 있나요? [3]

붐붐

2003-05-07 4,898
20

re: 아크로벳을 asp에서 핸들링 할수 있나요? (Ed. 1) [2]

송원석

2003-05-09 4,905
19

re: 아크로벳을 asp에서 핸들링 할수 있나요? (Ed. 1) [1]

붐붐

2003-05-20 1,739
18

질문입니다요..

lang2

2003-04-02 4,877
17

re: 질문입니다요..

송원석

2003-04-02 4,621
16

정규표현식 관련 질문입니다.

lang2

2003-03-26 4,862
15

re: 정규표현식 관련 질문입니다.

송원석

2003-03-26 4,621
14

re: 샘플코드입니다.

lang2

2003-03-27 4,671
13

re: 샘플코드입니다. [5]

송원석

2003-03-27 5,593
12

re: 감사합니다.

lang2

2003-03-27 4,897
11

ASP, ASP.NET & Script Forum 을 시작합니다. [4]

송원석

2003-02-22 5,275