gpt4 book ai didi

c++ - 具有特定条件的正则表达式

转载 作者:行者123 更新时间:2023-11-30 03:36:02 26 4
gpt4 key购买 nike

假设我想创建一个正则表达式来搜索字符串中的两个词,但条件是它只匹配它们,如果我要查找的两个词之间没有其他几个词之一。例如:

string input {"Somebody has typed in some words here."}

我正在寻找单词 somebody 和 words,但我只希望正则表达式匹配这些单词(如果它们之间没有键入单词(键入只是我不想的几个单词之一)站在某人和文字之间)。哪个正则表达式满足这个?我尝试了几种方法,但没有一种能达到我的预期效果。有人可以帮我吗?

最佳答案

我会通过避免使用 regex 来做到这一点, 因为一旦你引入一个 regex , Now you have 2 problems

给定:

  1. 我们搜索范围的开头:const auto first = "Somebody"s
  2. 我们搜索范围的结尾:const auto second = "words"s
  3. 范围内不应存在的单词集合:const vector<string> words = { "in"s }
  4. 输入字符串:const auto input = "Somebody has typed in some words here."s

我们可以这样做:

const auto start = input.find(first) + size(first);
const auto finish = input.find(second, start);

if (start != string::npos && finish != string::npos) {
istringstream range(input.substr(start, finish - start));

if (none_of(istream_iterator<string>(range), istream_iterator<string>(), [&](const auto& i) { return find(cbegin(words), cend(words), i) != cend(words); })) {
cout << "match\n";
} else {
cout << "not a match\n";
}
} else {
cout << "not a match\n";
}

Live Example


如果你嫁给了一个regex不过,有一种方法可以使用 regex 来做到这一点。 .例如,如果 words包含:“in”、“lorem”和“ipsum”,你会想要这样的东西:

\bSomebody\b(?:(\bin\b|\blorem\b|\bipsum\b).*|.)*?\bwords\b

然后我们只需要测试我们的比赛是否包含任何东西:

const regex re("\\b" + first + accumulate(next(cbegin(words)), cend(words), "\\b(?:(\\b" + words.front(), [](const auto& lhs, const auto& rhs) { return lhs + "\\b|\\b" + rhs; }) + "\\b).*|.)*?\\b" + second + "\\b");
smatch sm;

if (regex_search(input, sm, re) && sm[1].length() == 0U) {
cout << "match\n";
} else {
cout << "not a match\n";
}

Live Example

关于c++ - 具有特定条件的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40910575/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com