none
Visual Studio 2015에서 <regex> 사용 시 동작에 관하여 RRS feed

  • 질문

  • https://msdn.microsoft.com/ko-kr/library/bb982727.aspx#Semantic Details 문서의 DSW Character Escape에 의하면, 정규식에서 "\s" 와 "[[:s:]]", 그리고 "\S" 와 "[^[:s:]]" 는  동일한 값이라고 되어 있으나 실제로 match 연산을 수행해 보면 일부 유니코드 문자에 대해서 다른 결과를 내놓습니다. regex 인스턴스를 생성할 때 collate 옵션을 주고 생성해봐도 동일한 문제가 발생하는데 어떻게 해야 할까요?
    2016년 11월 1일 화요일 오전 5:19

답변

  • '✪' 와 같은 특수 문자에 대한 정규식 처리 결과의 미묘한 차이는

    제가 시원하게 답변드릴 수 있는 부분은 아닌 것 같습니다.

    MSDN 문서 내용대로라면 버그라고도 볼 수 있을 것 같아요.

    Visual Studio 2015 메뉴에 보시면 HELP -> Send Feedback -> Report a Problem 항목이 있습니다.

    여기에 관련 이슈를 보내보는 건 어떨까 싶네요.

    • 답변으로 표시됨 demian51 2016년 11월 17일 목요일 오전 2:36
    2016년 11월 16일 수요일 오전 4:40

모든 응답

  • 테스트 해보신 정규식 문자열은 무엇이었는지, 대상 문자열은 무엇이었는지 등의 정보가 부족합니다.

    실제 테스트 해보신 코드를 그대로 올려보시면 답변하는데 도움이 될 것 같네요.

    2016년 11월 1일 화요일 오전 6:09
  • 코드는 아래와 같습니다.

    static const std::wregex url_pattern
    (
    	// Originated by Diego Perini(https://gist.github.com/dperini/729294) - MIT License
    	// protocol identifier
    	L"(?:(?:https?|ftp)://)?"
    	// user:pass authentication or email address
    	L"(?:[\\w-\\.]{1,255}(?::\\S{0,255})?@)?"
    	L"(?:"
    	// IP address dotted notation octets
    	// excludes loopback network 0.0.0.0
    	// excludes reserved space >= 224.0.0.0
    	// excludes network & broacast addresses
    	// (first & last IP address of each class)
    	L"(?:1\\d\\d|2[01]\\d|22[0-3]|[1-9]\\d?)"
    	L"(?:\\.(?:2[0-4]\\d|25[0-5]|1?\\d{1,2})){2}"
    	L"(?:\\.(?:1\\d\\d|2[0-4]\\d|25[0-4]|[1-9]\\d?))"
    	L"|"
    	// domain name
    	L"(?:(?:[a-z\\u00a1-\\uffff0-9](?:[a-z\\u00a1-\\uffff0-9-_]{0,63}))?(?:[a-z\\u00a1-\\uffff0-9])\\.){1,127}"
    	// TLD identifier
    	L"(?:[a-z]{2,})"
    	L")"
    	// port number
    	L"(?::\\d{2,5})?"
    	// resource path
    	L"(?:[/?#](?:\\S{0,2000}))?"
    	, std::regex_constants::ECMAScript | std::regex_constants::icase | std::regex_constants::nosubs | std::regex_constants::optimize
    );
     
    const static std::wstring testset = L"http://foo.com/unicode_(✪)_in_parens";
     
    int main(void)
    {
    	const static std::wsregex_iterator regex_end;
     
    	for (auto itr = std::wsregex_iterator(testset.begin(), testset.end(), url_pattern); itr != regex_end; ++itr)
    	{
    		auto url_str = itr->str();
     
    		std::wcout << url_str.length() << " " << itr->str() << std::endl;
    	}
     
    	std::string str;
    	std::cin >> str;
    	return 0;
    }

    위 코드를 실행하면 결과로 "24 http://foo.com/unicode_(" 가 출력됩니다.

    반면 url_pattern 객체 내의 "\\S" 를 "[^[:s:]]" 로 치환하고 실행하면 "36 http://foo.com/unicode_(" 가 출력됩니다. url_str을 Watch 로 확인해 보면 "http://foo.com/unicode_(✪)_in_parens" 가 들어있어 의도한 대로 매칭된 것을 확인할 수 있습니다.


    • 편집됨 demian51 2016년 11월 16일 수요일 오전 2:49
    2016년 11월 16일 수요일 오전 2:46
  • '✪' 와 같은 특수 문자에 대한 정규식 처리 결과의 미묘한 차이는

    제가 시원하게 답변드릴 수 있는 부분은 아닌 것 같습니다.

    MSDN 문서 내용대로라면 버그라고도 볼 수 있을 것 같아요.

    Visual Studio 2015 메뉴에 보시면 HELP -> Send Feedback -> Report a Problem 항목이 있습니다.

    여기에 관련 이슈를 보내보는 건 어떨까 싶네요.

    • 답변으로 표시됨 demian51 2016년 11월 17일 목요일 오전 2:36
    2016년 11월 16일 수요일 오전 4:40
  • 네 그렇게 해보겠습니다. :)

    감사합니다!

    2016년 11월 17일 목요일 오전 2:36