2014-06-06 32 views
1

對於那些要求,{0}允許選擇由| |分隔的sResult字符串中的任何一個塊。 0是第一個塊C++:正則表達式:返回完整的字符串和不匹配的組

它需要動態爲未來擴展該數字將是由用戶

所以我上一個正則表達式的工作以提取字符串的1個部分配置的,但是同時它匹配結果回報不是預期的。

std::string sResult = "MATCH_ME|BUT|NOT|ANYTHNG|ELSE"; 
    std::regex pattern("^(?:[^|]+[|]){0}([^|;]+)"); 
    std::smatch regMatch; 

    std::regex_search(sResult, regMatch, pattern); 
    if(regMatch[1].matched) 
    { 
     for(int i = 0; i < regMatch.size(); i++) 
     { 
      //SUBMATCH 0 = "MATCH_ME|BUT|NOT|ANYTHNG|ELSE" 
      //SUBMATCH 1 = "BUT|NOT|ANYTHNG|ELSE" 
     std::ssub_match sm = regMatch[i]; 
     bValid = strcmp(regMatch[i].str().c_str(), pzPoint->_ptrTarget->_pzTag->szOPCItem); 
     } 
    } 

出於某種原因,我無法弄清楚代碼即可獲得我只是MATCH_ME回來,所以我可以把它比作在C++側預期的結果列表。

任何人都有我的錯在哪裏有任何想法。

+0

您能否澄清 - 給出一個輸入字符串的例子以及您希望輸出的內容。你在哪裏用「{0}」表示「匹配這個零次數」,你就沒有做任何事情...... – Floris

+0

如果你只是想匹配'MATCH_ME',爲什麼不用一個簡單的'^ [^ |] +'? – jasal

+0

你想用'{0}'量詞來做什麼? – Toto

回答

1

下面的代碼示例演示如何做你所追求的 - 你編譯這個,然後使用一個數值參數調用它來提取輸入的那個元素:

#include <iostream> 
#include <cstring> 
#include <regex> 

int main(int argc, char *argv[]) { 

    char pat[100]; 
    if (argc > 1) { 
     sprintf(pat, "^(?:[^|]+[|]){%s}([^|;]+)", argv[1]); 
     std::string sResult = "MATCH_ME|BUT|NOT|ANYTHNG|ELSE"; 
     std::regex pattern(pat); 
     std::smatch regMatch; 

     std::regex_search(sResult, regMatch, pattern); 
     if(regMatch[1].matched) 
     { 
     std::ssub_match sm = regMatch[1]; 
     std::cout << "The match is " << sm << std::endl; 
//bValid = strcmp(regMatch[i].str().c_str(), pzPoint->_ptrTarget->_pzTag->szOPCItem); 
     } 
    } 
    return 0; 
} 

創建名爲match的可執行文件,你可以做

>> match 2 
The match is NOT 

這就是你想要的。

正則表達式,它工作得很好 - 雖然作爲一個優先事項,我會使用\|而不是[|]爲第一部分。

+0

在這種情況下,您甚至不需要捕獲組。 – jasal

1

看來你正在使用正則表達式來處理他們沒有設計的東西。您應該首先將您的字符串拆分爲|,並在結果標記上應用正則表達式,以檢查其是否有效。

順便說一句:在libstdc++std::regex實施似乎是越野車。我只是做了一些測試,發現即使是簡單模式包含像\\|這樣的逃跑管道字符,也沒有編譯出std::regex_error,但在錯誤消息(GCC 4.8.1)中沒有進一步的信息。

+0

Upvoting建議不要使用大錘在圖釘上開車。 – Floris

+0

我明白你說了什麼,而且你很可能是對的,我似乎無法理解你爲什麼不能返回被捕獲的組,而沒有別的。 – asuppa

0

原來問題出在C端提取匹配,它必須更直接地完成,下面是讓我完全從字符串中得到我所需的代碼,以便稍後使用它。

std::string sResult = "MATCH_ME|BUT|NOT|ANYTHNG|ELSE"; 
std::regex pattern("^(?:[^|]+[|]){0}([^|;]+)"); 
std::smatch regMatch; 

std::regex_search(sResult, regMatch, pattern); 
if(regMatch[1].matched) 
{ 
    std::string theMatchedPortion = regMatch[1]; 
    //the issue was not with the regex but in how I was retrieving the results. 
    //theMatchedPortion now equals "MATCH_ME" and by changing the number associated 
     with it I can navigate through the string 
} 
+0

你使用什麼編譯器? – jasal

+0

好問題,我在VisualStudio2010平臺V100編碼不知道如果不回答你的問題,如果不讓我知道我如何能得到確切的編譯器版本,我會拉它。 – asuppa