那么拥有过滤字母的代码,以及/ ".:=
如何允许-
?
#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=\"/.: ]+"));
}
最佳答案
Boost's default Regex behaviour is Perl-compatible,并且man perlre说:
您可以通过包含字符列表来指定字符类
在[]
中,它将匹配列表中的任何字符。如果先
“ [”后面的字符是“ ^”,则该类与不在
名单。在列表中,“-”字符指定范围,因此
a-z
表示介于“ a”和“ z”之间的所有字符。如果你
希望“-”或“]”本身成为类的成员,然后将其放在
列表的开头(可能在“ ^”之后),或使用
反斜杠。当在末尾时,“-”也按字面意义使用
列表,紧接在“]”之前。 (以下全部指定相同
三个字符的类别:[-az]
,[az-]
和[a\-z]
。全部是
与[a-z]
不同,\w
指定包含26个的类
字符,甚至在基于EBCDIC的字符集上也是如此。)此外,如果您尝试
使用字符类\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=\\-\"/.: ]+"))
(请注意,双反斜杠;一个为字符串文字转义,另一个为正则表达式转义)。
我推荐前者。
始终将文档作为您的第一个联系港口!