作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
// regex_replace example
#include <iostream>
#include <string>
#include <regex>
#include <iterator>
int main ()
{
std::string INPUT = "Replace_All_Characters_With_Anything";
std::string OUTEXP = "0";
std::regex expression("[A-Za-z]", std::regex_constants::icase);
std::cout << std::regex_replace(INPUT, expression, OUTEXP);
return 0;
}
这在这里工作:
http://cpp.sh/6gb5a
[]
匹配的东西只有在所述字符没有出现在不匹配之后才有效。
[A-Za-z]{1}
编译器:
最佳答案
不确定这是否是回答的适当用法。但这是一个已知的错误,看起来这个错误已经存在几个月了。据我所知,没有修复的预计到达时间。
https://github.com/microsoft/STL/issues/993
看起来 RE2 是推荐的替代正则表达式库。
https://github.com/google/re2/
我将创建一个函数,而不是使用另一个库,该函数可用于拦截和更改正则表达式字符串作为临时修复。无论是否使用 icase 标志都应该工作。
测试代码:https://rextester.com/LSNW3495
// add '{1}' after square bracket ranges unless there already is a quantifier or alternation such as '?' '*' '+' '{}'
std::string temporaryBugFix(std::string exp)
{
enum State
{
start,
skipNext,
lookForEndBracket,
foundEndBracket,
};
State state = start;
State prevState = start;
int p = -1;
std::vector<int> positionsToFix;
for (auto c : exp)
{
++p;
switch (state)
{
case start:
if (c == '\\')
{
prevState = state;
state = skipNext;
}
else if (c == '[')
state = lookForEndBracket;
continue;
case skipNext:
state = prevState;
continue;
case lookForEndBracket:
if (c == '\\')
{
prevState = state;
state = skipNext;
}
else if (c == ']')
{
state = foundEndBracket;
if (p + 1 == exp.length())
positionsToFix.push_back(p + 1);
}
continue;
case foundEndBracket:
if (c != '+' && c != '*' && c != '?')
positionsToFix.push_back(p);
state = start;
continue;
}
}
// check for valid curly brackets so we don't add an additional one
std::string s = exp;
std::smatch m;
std::regex e("\\{\\d+,?\\d*?\\}");
int offset = 0;
vector<int> validCurlyBracketPositions;
while (regex_search(s, m, e))
{
validCurlyBracketPositions.push_back(m.position(0) + offset);
offset += m.position(0) + m[0].length();
s = m.suffix();
}
// remove valid curly bracket positions from the fix vector
for (auto p : validCurlyBracketPositions)
positionsToFix.erase(std::remove(positionsToFix.begin(), positionsToFix.end(), p), positionsToFix.end());
// insert the fixes
for (int i = positionsToFix.size(); i--; )
exp.insert(positionsToFix[i], "{1}");
return exp;
}
关于C++ 正则表达式错误!方括号表达式不适用于 icase 标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63854900/
我是一名优秀的程序员,十分优秀!