정규 표현식 오류 - Quantifier {x,y} following nothing.
실수로 작성한 정규 표현식이,
^(?)(.*?)(TEST)(.*?)$
자바에서는 그냥 돌아가지만,
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());
}
}
닷넷으로 옮겨 보면,
string pattern = @"^(?)(.*?)(TEST)(.*?)$";
Regex x = new Regex(pattern, RegexOptions.Compiled);
Console.WriteLine(x.Replace("TEST IS GOOD", "$1"));
이렇게 예외가 발생합니다.
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)
문제가 되는 지점은 "(?)" 표현인데요, 물음표(?)의 의미가 정규 표현식에서 "{0, 1}"에 해당하는 것으로 앞선 문자에 대한 0 ~ 1개의 표현을 담당하는데, "(?)" 표현에서는 문자에 대한 지정이 없기 때문에 저런 오류가 발생하는 것입니다.
관련 표현을 파이썬과 같은 언어에서도 해도,
import re
p = re.compile("^(?)(.*?)(TEST)(.*?)$")
result = p.match("TEST IS GOOD")
print(result)
다음과 같이 예외가 발생합니다.
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
마찬가지의 문제입니다.
그러니까, 정규 표현식의 파싱이 언어들 간의 라이브러리에서 정확하지 않을 수 있음을 알아야 합니다.
참고로, (?) 실수는 처음에 대소문자 구분을 하지 않을(turn-on) 의도로 (?i) 표현을 쓴 것이 변한 것이었습니다.
What do `?i` and `?-i` in regex mean?
; https://stackoverflow.com/questions/15145659/what-do-i-and-i-in-regex-mean
그 외에 물음표가 사전 문자 필요 없이 사용되는 경우가 제법 많습니다.
Grouping Constructs in Regular Expressions
; https://docs.microsoft.com/en-us/dotnet/standard/base-types/grouping-constructs-in-regular-expressions#noncapturing-groups
그리고 저 내용 중에 look-around 관련한 사례는 예전에 설명한 적이 있습니다. ^^
특정 단어로 시작하거나/끝나는 문자열을 포함/제외하는 정규 표현식 - Look-around
; https://www.sysnet.pe.kr/2/0/12734
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]