2016-09-27 155 views
0

我如何定義一個C++相匹配的字符串或者11/ECMAScript的正則表達式兼容聲明:C++ 11正則表達式IfThenElse - 單一,封閉的括號匹配或不匹配的括號

  1. 包含一個單一的,封閉,一對包含長度大於0的字母數字字符串的圓括號 - 例如正則表達式"\(\w+\)",它正確匹配"(abc_123)",並忽略不正確的"(abc_123""abc_123)""abc_123"。但是,上述表達式不會忽略包含多個平衡/不平衡包圍的輸入字符串 - 我想從匹配的結果中排除"((abc_123)""(abc_123))""((abc_123))"

  2. 或單個,字母詞,沒有任何不平衡的括號 - 例如像正則表達式語句"\w+"正確匹配"abc_123",但遺憾的是不正確地匹配"(abc_123""abc_123)""((abc_123)""(abc_123))""((abc_123))" ...

爲了清楚起見,對於每個上述的測試用例的需要匹配數是:

  • "abc_123" =匹配,
  • "(abc_123)" =匹配,
  • "(abc_123" =不匹配,
  • "abc_123)" =不匹配,
  • "((abc_123)" =不匹配,
  • "(abc_123))" =不匹配,
  • "((abc_123))" =未匹配。

我一直在落實http://www.regular-expressions.info/conditional.html建議IfThenElse格式玩耍,但很遠還沒有得到...是否有某種方式來限制特定組[例如中出現的次數"(\(){0,1}"匹配零個或一個左手圓括號],並將前一個組的重複次數傳遞給後一個組["num\1"等於括號出現在"(\(){0,1}"中的次數,然後我可以將它傳遞給相應的右括號組,"(\)){num\1}"說...]

+0

你確定這可以通過常規的語言來表示? – MrEricSir

+0

您是否願意接受使用Boost.Regex而不是C++ 11正則表達式的解決方案?我認爲如果你使用否定的後置斷言可以做到這一點,但這些不被C++支持。11正則表達式 – harmic

+0

它只需要大約四行代碼直接檢查這個匹配。爲什麼使用正則表達式使其複雜化? –

回答

0

不是你想怎麼樣,我想,和非真正優雅,但...

用「或」(|),你應該獲得更好勝於無解決方案基於"\\(\\w+\\)|\\w+"

完整的例子如下

#include <regex> 
#include <iostream> 

bool isMatch (std::string const & str) 
{ 
    static std::regex const 
     rgx { "\\(\\w+\\)|\\w+" }; 

    std::smatch srgx; 

    return std::regex_match(str, srgx, rgx); 
} 

int main() 
{ 
    std::cout << isMatch("abc_123")  << std::endl; // print 1 
    std::cout << isMatch("(abc_123)") << std::endl; // print 1 
    std::cout << isMatch("(abc_123") << std::endl; // print 0 
    std::cout << isMatch("abc_123)") << std::endl; // print 0 
    std::cout << isMatch("((abc_123)") << std::endl; // print 0 
    std::cout << isMatch("(abc_123))") << std::endl; // print 0 
    std::cout << isMatch("((abc_123))") << std::endl; // print 0 
} 
+0

我有一個印象,OP希望找到輸入中包含的匹配子字符串(例如,regex_search而不是regex_match)。否則,像你所做的那樣解決這個問題是微不足道的。 – harmic

+0

@harmic - 我不清楚OP想要什麼;你的印象可能是正確的,但是......在這種情況下,爲什麼「(abc_123」應該失敗呢?希望OP能夠澄清,而且是的:我的解決方案確實很簡單,但它的真正問題在於重複括號之間的部分:if我們需要接受其他類型的封閉圓括號('[]'或'{}'),我們需要重複'\\ w +'部分。 – max66