所以有这样的代码可以过滤字母,/ ".:=
如何允许-
?
#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=\"/.: ]+"));
}
答案 0 :(得分:1)
使用\
转义它。这应该工作。 \-
。
你实际上必须做两次。 \\-
一次逃离\
,第二次逃离-
。
答案 1 :(得分:1)
将其放在括号内,如[^a-zA-Z0-9=\"/.: -]
。
答案 2 :(得分:1)
Boost's default Regex behaviour is Perl-compatible,man perlre说:
您可以通过包含字符列表来指定字符类 在
[]
中,它将匹配列表中的任何字符。如果是第一个 在“[”为“^”之后的字符,该类匹配任何不在的字符 列表。 在列表中,“ - ”字符指定范围,以便a-z
代表“a”和“z”之间的所有字符,包括在内。如果你 希望“ - ”或“]”本身成为一个类的成员,将它放在 列表的开头(可能在“^”之后),或者用a来转义它 反斜杠。 “ - ”也是字面意思,当它在结束时 列表,就在结束“]”之前。 (以下都指定相同 三个字符的类:[-az]
,[az-]
和[a\-z]
。全部是 不同于[a-z]
,它指定一个包含二十六个的类 字符,甚至基于EBCDIC的字符集。)另外,如果你尝试 使用字符类\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=\\-\"/.: ]+"))
(注意双反斜杠;一个为字符串文字转义,另一个为正则表达式转义)。
我推荐前者。
请务必查看文档作为您的第一个停靠点!