ALL,
有没有更好的方法:
if( str.find( L"[abc]" ) == std::wstring::npos && str.find( L"abc" ) != std::wstring::npos )
我觉得这不是最佳/优雅的。
TIA!
答案 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]”,并发现了一个挑战。如果得到解决,结果表达将是漫长而难以阅读的。正则表达式也不是“快速”(取决于您的要求)。