성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] 그냥 RSS Reader 기능과 약간의 UI 편의성 때문에 사용...
[이종효] 오래된 소프트웨어는 보안 위협이 되기도 합니다. 혹시 어떤 기능...
[정성태] @Keystroke IEEE의 문서를 소개해 주시다니... +_...
[손민수 (Keystroke)] 괜히 듀얼채널 구성할 때 한번에 같은 제품 사라고 하는 것이 아...
[정성태] 전각(Full-width)/반각(Half-width) 기능을 토...
[정성태] Vector에 대한 내용은 없습니다. Vector가 닷넷 BCL...
[orion] 글 읽고 찾아보니 디자인 타임에는 InitializeCompon...
[orion] 연휴 전에 재현 프로젝트 올리자 생각해 놓고 여의치 않아서 못 ...
[정성태] 아래의 글에 정리했으니 참고하세요. C# - Typed D...
[정성태] 간단한 재현 프로젝트라도 있을까요? 저런 식으로 설명만 해...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>정규 표현식 오류 - Quantifier {x,y} following nothing.</h1> <p> 실수로 작성한 정규 표현식이,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ^(?)(.*?)(TEST)(.*?)$ </pre> <br /> 자바에서는 그냥 돌아가지만,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > import java.util.regex.*; public class Main { public static void main(String[] args) { Pattern p = Pattern.compile("^(?)(.*?)(TEST)(.*?)$"); Matcher m = p.matcher("TEST IS GOOD"); System.out.println(m.matches()); } } </pre> <br /> 닷넷으로 옮겨 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > string pattern = @"^(?)(.*?)(TEST)(.*?)$"; Regex x = new Regex(pattern, RegexOptions.Compiled); Console.WriteLine(x.Replace("TEST IS GOOD", "$1")); </pre> <br /> 이렇게 예외가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Unhandled Exception: System.ArgumentException: parsing "^(?)(.*?)(TEST)(.*?)$" - Quantifier {x,y} following nothing. at System.Text.RegularExpressions.RegexParser.ScanRegex() at System.Text.RegularExpressions.RegexParser.Parse(String re, RegexOptions op) at System.Text.RegularExpressions.Regex..ctor(String pattern, RegexOptions options, TimeSpan matchTimeout, Boolean useCache) at System.Text.RegularExpressions.Regex..ctor(String pattern, RegexOptions options) at ConsoleApp1.Program.Main(String[] args) </pre> <br /> 문제가 되는 지점은 "(?)" 표현인데요, 물음표(?)의 의미가 정규 표현식에서 "{0, 1}"에 해당하는 것으로 앞선 문자에 대한 0 ~ 1개의 표현을 담당하는데, "(?)" 표현에서는 문자에 대한 지정이 없기 때문에 저런 오류가 발생하는 것입니다.<br /> <br /> 관련 표현을 파이썬과 같은 언어에서도 해도,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > import re p = re.compile("^(?)(.*?)(TEST)(.*?)$") result = p.match("TEST IS GOOD") print(result) </pre> <br /> 다음과 같이 예외가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Traceback (most recent call last): File "C:\temp\PythonApplication1.py", line 4, in <module> p = re.compile("^(?)(.*?)(default\.aspx)(.*?)$") File "E:\Python38\lib\re.py", line 252, in compile return _compile(pattern, flags) File "E:\Python38\lib\re.py", line 304, in _compile p = sre_compile.compile(pattern, flags) File "E:\Python38\lib\sre_compile.py", line 764, in compile p = sre_parse.parse(p, flags) File "E:\Python38\lib\sre_parse.py", line 948, in parse p = _parse_sub(source, state, flags & SRE_FLAG_VERBOSE, 0) File "E:\Python38\lib\sre_parse.py", line 443, in _parse_sub itemsappend(_parse(source, state, verbose, nested + 1, File "E:\Python38\lib\sre_parse.py", line 823, in _parse raise source.error("unknown extension ?" + char, re.error: unknown extension ?) at position 2 </pre> <br /> 마찬가지의 문제입니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 그러니까, 정규 표현식의 파싱이 언어들 간의 라이브러리에서 정확하지 않을 수 있음을 알아야 합니다.<br /> <br /> 참고로, (?) 실수는 처음에 대소문자 구분을 하지 않을(turn-on) 의도로 (?i) 표현을 쓴 것이 변한 것이었습니다. <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > What do `?i` and `?-i` in regex mean? ; <a target='tab' href='https://stackoverflow.com/questions/15145659/what-do-i-and-i-in-regex-mean'>https://stackoverflow.com/questions/15145659/what-do-i-and-i-in-regex-mean</a> </pre> <br /> 그 외에 물음표가 사전 문자 필요 없이 사용되는 경우가 제법 많습니다. <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Grouping Constructs in Regular Expressions ; <a target='tab' href='https://learn.microsoft.com/en-us/dotnet/standard/base-types/grouping-constructs-in-regular-expressions#noncapturing-groups'>https://learn.microsoft.com/en-us/dotnet/standard/base-types/grouping-constructs-in-regular-expressions#noncapturing-groups</a> </pre> <br /> 그리고 저 내용 중에 look-around 관련한 사례는 예전에 설명한 적이 있습니다. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 특정 단어로 시작하거나/끝나는 문자열을 포함/제외하는 정규 표현식 - Look-around ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12734'>https://www.sysnet.pe.kr/2/0/12734</a> </pre> </p><br /> <br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
6847
(왼쪽의 숫자를 입력해야 합니다.)