게시판 본문 ASP, ASP.NET, IIS & Script - Read Only
re: [질문] 아래질문에 이어 ^^ (죄송~) |
---|
작성자: 송원석
작성일시: 2003-06-17 23:12,
조회수: 4,370
|
안녕하세요? 송원석 입니다. ^_^
말씀하신 두 개의 정규 표현식 패턴 모두 약간은 뭐랄까... 좀 미묘한 (?) 결과를 만들어 낼 수도 있는 것들이라고 생각됩니다. ^_^;;; 먼저 두 개중 조금더 간단하다고 생각되는 ( )? 를 먼저 살펴보도록 하겠습니다. 이 패턴을 하나씩 분해해서 살펴보도록 하죠... 먼저 의 의미는 명확하군요. 아마 어떤 웹 페이지의 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 | 2003-06-25 | 7,278 | ||
29 | 2003-06-19 | 4,735 | ||
28 | 2003-06-20 | 4,873 | ||
27 |
신순유 |
2003-06-17 | 1,479 | |
2003-06-17 | 4,370 | |||
25 |
신순유 |
2003-06-16 | 1,762 | |
24 | 2003-06-16 | 4,282 | ||
23 |
안녕하세요.. [2] |
진진 |
2003-05-26 | 1,670 |
22 |
re: 안녕하세요.. [1] |
2003-05-27 | 4,468 | |
21 | 2003-05-07 | 5,107 | ||
20 | 2003-05-09 | 5,100 | ||
19 |
붐붐 |
2003-05-20 | 1,739 | |
18 | 2003-04-02 | 5,084 | ||
17 | 2003-04-02 | 4,814 | ||
16 | 2003-03-26 | 5,047 | ||
15 | 2003-03-26 | 4,819 | ||
14 | 2003-03-27 | 4,858 | ||
13 |
re: 샘플코드입니다. [5] |
2003-03-27 | 5,810 | |
12 | 2003-03-27 | 5,081 | ||
11 | 2003-02-22 | 5,463 |