查找字符串

时间:2018-01-21 04:18:43

标签: c++11

ALL,

有没有更好的方法:

if( str.find( L"[abc]" ) == std::wstring::npos && str.find( L"abc" ) != std::wstring::npos )

我觉得这不是最佳/优雅的。

TIA!

1 个答案:

答案 0 :(得分:1)

我可以将其设为最佳正确,但要使其“优雅”将是一项挑战。

我的代码设计首选顺序始终是正确性。然后是可维护性,然后是优化优雅代码如果没有达到其他三个目标则意味着什么。

:)

要获得完全您想要的内容,即找到匹配字符串中的子字符串("abc"),但忽略所有括号内的匹配项("[abc]"),存在括号内匹配和非括号匹配的可能性 - 您需要在循环内调用find。

以下代码与“abc”匹配:

  • 字符串的开头:pos == 0
  • 字符串的结尾:pos+pattern.size() == str.size()
  • 在字符串的中间,但没有括号:(str[pos - 1] != '[') || (str[pos+pattern.size()] != ']')

然后循环直到找到npos或即将超过字符串的末尾。

wstring pattern = L"abc";
size_t pos = 0;
size_t start = 0;

while (start + pattern.size() <= str.size())
{
    pos = str.find(pattern, start);
    bool match = (pos != string::npos) &&
                 (
                     (pos == 0) || (pos+pattern.size() == str.size()) || (str[pos - 1] != '[') || (str[pos+pattern.size()] != ']')
                 );
    if (match)
    {
        cout << "match found at " << pos << endl;
        break;
    }
    start = (pos == wstring::npos) ? str.size() : pos +  pattern.size();
}

获得更“优雅”解决方案的替代方案可能是使用regex。我尝试将一个与“abc”匹配的正则表达式原型化,但不是“[abc]”,并发现了一个挑战。如果得到解决,结果表达将是漫长而难以阅读的。正则表达式也不是“快速”(取决于您的要求)。