我正在尝试将通配符形式的用户输入更改("*word*")为正则表达式格式.为此,我使用下面的代码去除'*'输入的开头和结尾,以便我可以在任一端添加正则表达式字符:
string::iterator iter_begin = expressionBuilder.begin();
string::iterator iter_end = expressionBuilder.end();
iter_end--;
if ((char)*iter_begin == '*' && (char)*iter_end == '*')
{
expressionBuilder.erase(iter_begin);
expressionBuilder.erase(iter_end);
expressionBuilder = "\\b\\w*" + expressionBuilder + "\\w*\\b";
}
Run Code Online (Sandbox Code Playgroud)
然而,调用"expressionBuilder.erase(iter_end)"并不会删除尾随'*'从输入字符串,所以我风与不正确的正则表达式.我在这做错了什么? "(char)*iter_end == '*'"对于要运行的if语句中的代码必须为true(它确实如此),那么为什么传递给erase()时相同的迭代器不起作用?
到目前为止,您的原始代码和建议的解决方案除了您发布的明显问题外还有一些问题:
现在,如果使用代码段/例程的代码已经验证字符串至少有2个字符,那么最后两个项目可能不是真正的问题,但是如果不是这种情况,我认为以下内容更加强大面对expressionBuilder的任意值:
// using the reverse iterator rbegin() is a nice easy way
// to get the last character of a string
if ( (expressionBuilder.size() >= 2) &&
(*expressionBuilder.begin() == '*') &&
(*expressionBuilder.rbegin() == '*') ) {
expressionBuilder.erase(expressionBuilder.begin());
// can't nicely use rbegin() here because erase() wont take a reverse
// iterator, and converting reverse iterators to regular iterators
// results in rather ugly, non-intuitive code
expressionBuilder.erase(expressionBuilder.end() - 1); // note - not invalid since we're getting it anew
expressionBuilder = "\\b\\w*" + expressionBuilder + "\\w*\\b";
}
Run Code Online (Sandbox Code Playgroud)
需要注意的是,当这个代码将工作expressionBuilder是"","*"或者"**"在不执行任何未定义行为.但是,在这些情况下,它可能无法产生您想要的结果(因为我不确切知道在这些情况下您想要的是什么).修改以满足您的需求.
尝试以相反的顺序擦除它们:
expressionBuilder.erase(iter_end);
expressionBuilder.erase(iter_begin);
Run Code Online (Sandbox Code Playgroud)
删除第一个 * 后,iter_end 指的是示例中字符串末尾之后的一个字符。STL文档表明迭代器因 无效erase(),因此从技术上讲,我的示例也是错误的,但我相信它在实践中会起作用。