那么拥有过滤字母的代码,以及/ ".:=如何允许-

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


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

我推荐前者。



始终将文档作为您的第一个联系港口!

10-05 18:31
查看更多