匹配由符号分隔并忽略空格的重复单词

时间:2017-11-03 16:59:36

标签: c++ regex

如何匹配由特定字符分隔的字符,让我们说&#39 ;;'并忽略比赛前后的空间但保留在内部的空间?

(word1); (word2) ; (word31 word32) Paranteses仅表示匹配。

到目前为止,我有\s*([a-zA-Z0-9\s]*[a-zA-Z0-9]+)\s*[;]但我不知道如何重复这些词。它还应该能够处理空单词,例如(word);;(word)(word); ;(word)(word);(word);。因为它忽略了空格,所以前两个应该是等价的。

好主要的问题是我不知道如何处理分裂以及合法词和空词的两个选项,因为我的陈述需要至少1个符号。

或者它可以解决,如果我允许重复的分隔符,其间有空格,但循环回到我不知道如何处理分裂的事实。

编辑:我也打算在C ++中使用它 编辑:这可能是它,我可以得到事实检查吗? \s*([a-zA-Z0-9\s]*[a-zA-Z0-9]+)[;]*\s*[;]*

2 个答案:

答案 0 :(得分:1)

由于使用嵌套量词的长regexp(即使是根据unroll-the-loop原则编写)通常会导致std::regex出现问题,因此在这种情况下,分裂方法似乎最好。

这是C++ demo

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

int main() {
    std::vector<std::string> strings;
    std::string s = "word1; word2  ; word31 word32";
    std::regex re(R"(\s*;\s*)");
    std::regex_token_iterator<std::string::iterator> it(s.begin(), s.end(), re, -1);
    decltype(it) end{};
    while (it != end){
        strings.push_back(*it++);
    }
    for (auto& s: strings){ //std::cout << strings[strings.size()-1] << std::endl;
        std::cout << "'" << s << "'" << std::endl;
    }
    return 0;
}

输出:

'word1'
'word2'
'word31 word32'

模式在R"(\s*;\s*)"中定义 - 它匹配用0+空格括起来的分号。

注意:这种方法可能需要从空格中修剪输入字符串,有关剥离前导/尾随空格的各种方法,请参阅What's the best way to trim std::string?

答案 1 :(得分:0)

试试这个:

#include <iostream>
#include <string>
#include <regex>

int main()
{
    std::string s = "  w1 w2 w3;   word1 word2    ; word1  ;  ";

    for (std::smatch m; std::regex_search(s, m, std::regex("\\b([a-z0-9\\s]+)\\b", std::regex::icase)); s = m.suffix())
    {
        std::cout << m[1] << std::endl;
    }

    return 0;
}

打印:

w1 w2 w3
word1 word2
word1