2011-09-18 47 views
0

所以有這樣的代碼來過濾字母,而/ ".:=如何允許-正則表達式字符串過濾 - 如何讓`-`符號?

#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]所有來自[a-z],其指定含有26 字符,即使在基於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=\\-\"/.: ]+")) 

(注意雙反斜線;一個逃避字符串文字,並且所述第二逃避正則表達式) 。

我推薦前者。


請務必查看該文檔作爲您的第一個掛靠端口!

1

\將它換掉。這應該工作。 \-

你實際上必須做兩次。 \\-有一次逃脫\,第二次逃脫-

+0

在內存位置0x003ef0a4處出現'boost :: exception_detail :: clone_impl 失敗..' – Rella

+0

@Kambumbus - 再試一次。 –

+0

如果你把它放在正確的地方,你根本不需要逃避它。 –

1

把它放在括號內,如[^a-zA-Z0-9=\"/.: -]

+0

Grate!)但爲什麼要這樣做呢? – Rella

+0

@卡布姆斯:因爲你要求包含這個角色。你爲什麼認爲不應該這樣做? –

+1

因爲通常 - 意味着一個範圍,就像你在那裏使用的a-z一樣。 – jpa

相關問題