2011-09-18 4 views
0

그런 글자를 필터링하는 코드가있어서 / ".:= 허용 방법 -?RegExp 문자열 필터링 - '-'표시를 허용하는 방법?

#include <boost/regex.hpp> 
#include <boost/algorithm/string/regex.hpp> 

std::string filter_args(std::string args) 
{ 
    std::cout << boost::erase_all_regex_copy(args, boost::regex("[^a-zA-Z0-9=\"/.: ]+")); 
    return boost::erase_all_regex_copy(args, boost::regex("[^a-zA-Z0-9=\"/.: ]+")); 
} 

답변

1

Boost's default Regex behaviour is Perl-compatibleman perlre는 말한다 :

당신은 목록에서 모든 문자를 일치 문자 []에서 의 목록을 둘러싸, 문자 클래스를 지정할 수 있습니다. "["가 "^"뒤에 오는 첫 번째 문자 인 경우 클래스는 에없는 문자와 일치합니다. 목록에서 "-"문자는 범위를 지정하므로 a-z은 "a"와 "z"사이의 모든 문자를 나타냅니다. "-"또는 "]"자체가 클래스 구성원 인 경우 목록의 시작 부분에 ("^"다음에)을 입력하거나 백 슬래시로 이스케이프 처리하십시오. "-"는 닫는 "]"바로 앞의 목록 끝에있을 때 그대로 사용됩니다. (모두 세 개의 동일한 문자 클래스를 지정하십시오. [-az], [az-][a\-z]을 모든 심지어 EBCDIC 기반 문자 세트에 스물여섯 문자를 포함하는 클래스를 지정 [a-z], 다른 이다.) 또한, 범위의 을 엔드 포인트대로 사용하는 문자 클래스 \w, \W, \s, \S, \d, 또는 \D하려고하면은 "-"문자 그대로 이해된다.


그래서 :

boost::erase_all_regex_copy(args, boost::regex("[^a-zA-Z0-9=\"/.: -]+")) 

또는

boost::erase_all_regex_copy(args, boost::regex("[^a-zA-Z0-9=\\-\"/.: ]+")) 

(이중 백 슬래시주의, 정규식에 대한 탈출 한 리터럴 문자열을 탈출하고, 두 번째)

.

전 권장합니다.


항상 전화 문의 첫 번째 포트로 문서를 확인하십시오!

1

\으로 탈출하십시오. 그게 효과가있다. \-.

실제로 두 번해야합니다. \\- 한 번만 \을 탈출하고 두 번째는 -을 탈출합니다.

+0

은 메모리 위치 0x003ef0a4에서'boost :: exception_detail :: clone_impl >와 함께 실패합니다. – Rella

+0

@Kambumbus - 다시 시도하십시오. –

+0

올바른 장소에 놓으면 전혀 탈출 할 필요가 없습니다. –

1

[^a-zA-Z0-9=\"/.: -]과 같이 대괄호 안에 넣어야합니다.

+0

가라지!) 그러나 이것이 왜 이렇게 될 것입니까? – Rella

+0

@ 카불 버스 : 당신이 그 캐릭터를 포함시켜달라고 요청했기 때문입니다. 왜 그렇게되지 않을 것이라고 생각하니? –

+1

보통 - 범위를 의미하므로 a-z와 같이 범위를 사용합니다. – jpa