2016-06-19 69 views
2

我有喜歡尋找C++正則表達式任選包含空格

"<firstname>Anna</firstname>" 

"<firstname>Anna Lena</firstname>" 

一個字符串,我想用正則表達式來獲取的名字給它(所以纔有「安娜「或」Anna Lena「)。目前我使用:

std::regex reg1 ("(<firstname>)([a-zA-Z0-9]*)(</firstname>)"); 

std::regex_replace (std::back_inserter(result), input.begin(), input.end(), reg1, "$2"); 

與只有一個名字效果很好,但顯然它之後錯過任何東西,因爲它沒有考慮空格。現在我已經嘗試添加\s((([a-zA-Z0-9]*)|\s)*)但我的IDE(Qt)告訴我,那\s是一個未知的轉義序列。 現在,"<firstname>Anna Lena</firstname>"結果爲"<firstname>Anna"

如何以優雅的方式解決這個問題?

+0

'的std ::正則表達式REG1(「()([A-ZA-Z0-9 \\秒] *) ()「);'或'std :: regex reg1(R」(()([a-zA-Z0-9 \ s] *)())「);' –

+0

結果保持不變。 – Saftkeks

+0

[這裏](https://ideone.com/fHdqn7)它運行良好。我從firstname標籤中刪除了捕獲組,並獲得了match [1]組1的值。爲什麼在使用'std :: regex'的時候提到Qt?你到底在用什麼?請分享完整的相關代碼 –

回答

0

使用不願意量詞爲點:

std::regex reg1 ("<firstname>(.*?)</firstname>"); 

或者,你可以用「不是直角」:

std::regex reg1 ("<firstname>[^<]*</firstname>"); 

注意,我刪除周圍的標籤文字不必要的組,所以目標是組1(你的正則表達式在組2中捕獲它)。

+0

'std :: regex reg1(「(。*?)」);'grabs「 Anna」,如果只有一個名字, 「不是一個正確的角度」也是一樣。也許我做錯了那是非常基本的......? – Saftkeks

+0

@saf這裏是一個[現場演示](http://rubular.com/r/6ve4mPqxXH)的正則表達式捕獲「安娜莉娜」作爲組1。 – Bohemian

0

在我看來,您在back_converterregex_replace插入new elements automatically at the end of the container有問題。

我建議將\s添加到字符類並匹配字符串,而不是重新分配矢量字符串。

這裏是一個demo of my approach

#include <iostream> 
#include <regex> 
using namespace std; 

int main() { 
    std::vector<std::string> strings; 
    strings.push_back("<firstname>Anna</firstname>"); 
    strings.push_back("<firstname>Anna Lena</firstname>"); 
    std::regex reg("(<firstname>)([a-zA-Z0-9\\s]*)(</firstname>)"); 
    for (size_t k = 0; k < strings.size(); k++) 
    { 
     smatch s; 
     if (std::regex_match(strings[k], s, reg)) { 
      strings[k] = s[2]; 
      std::cout << strings[k] << std::endl; 
     } 
    } 
    return 0; 
} 

輸出:

Anna 
Anna Lena