RegEx字符串过滤 - 如何允许`-`标志?

时间:2011-09-18 13:47:40

标签: c++ regex boost

所以有这样的代码可以过滤字母,/ ".:=如何允许-

#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=\"/.: ]+"));
}

3 个答案:

答案 0 :(得分:1)

使用\转义它。这应该工作。 \-

你实际上必须做两次。 \\-一次逃离\,第二次逃离-

答案 1 :(得分:1)

将其放在括号内,如[^a-zA-Z0-9=\"/.: -]

答案 2 :(得分:1)

Boost's default Regex behaviour is Perl-compatibleman 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=\\-\"/.: ]+"))

(注意双反斜杠;一个为字符串文字转义,另一个为正则表达式转义)。

我推荐前者。


请务必查看文档作为您的第一个停靠点!