2012-11-13 26 views
1

我只是切換到使用內置的正則表達式的功能regex.h(是跨平臺)。並用以下簡單的regex,許多有效的投入,如[email protected]現在失敗(其中[email protected]仍然正常工作):與POSIX正則表達式奇怪的結果在Xcode

^[^@\s][email protected][^@\s]+\.[^\s\[email protected]]+$ 

調用代碼:

return Common::regexMatch("^[^@\\s][email protected][^@\\s]+\\.[^\\s\\[email protected]]+$", userInput); 

而這裏的實現:

#import "regex.h" 

bool Common::regexMatch(const string& regex, const string& text) { 
    //return [[NSString stringWithCString:text.c_str() encoding:NSUTF8StringEncoding] isMatchedByRegex:[NSString stringWithCString:regex.c_str() encoding:NSUTF8StringEncoding]]; 

    regex_t re = {0}; 
    if (regcomp(&re, regex.c_str(), REG_NOSUB | REG_EXTENDED | REG_ICASE) != 0) 
     return false; 
    int status = regexec(&re, text.c_str(), (size_t)0, NULL, 0); 
    regfree(&re); 
    if (status != 0) 
     return false; 
    return true; 
} 

這是令人費解的是它基於不同的萊特在辨別r,當正則表達式模式根本沒有字母規範。而且它不一樣的投入是非常一致的。 TIA。

+1

既然是'是失敗了,您s',我想這與逃逸問題。嘗試用單個替換雙反斜槓。另外,沒有必要在字符類中跳過這段時間。永遠。 –

+0

嘿感謝快速回復,這是超級有幫助的。原來POSIX擴展不支持轉義空格字符,但只是字面上的空間很好,所以我更換了所有的「\\的」有「」,它發射的權利了! – leontx

+0

注意,'\ s'具有比單一的空間不同的含義。 '\ s'等價於'[\ t \ n \ r]'。所以它匹配任何類型的空白。同樣,隨時將解決方案發布到您的問題上作爲答案並接受它。如果你自己發現了這個問題,那是非常有效的。 –

回答

0

原來POSIX擴展不支持轉義空格字符,但只是字面上的空間很好,所以我全部換成了「\ S」的有「」,它發射權利了。

欲瞭解更多信息,請參閱https://stackoverflow.com/a/400316/497357