gpt4 book ai didi

C++ 正则表达式错误!方括号表达式不适用于 icase 标志

转载 作者:行者123 更新时间:2023-12-03 06:50:19 25 4
gpt4 key购买 nike

// 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
这在这里工作: https://regexr.com/5bt9d
问题似乎归结为是否使用 icase 标志。由于存在下划线,A in All、C 在 Characters、W in With 等不会被替换。错误似乎是使用 []匹配的东西只有在所述字符没有出现在不匹配之后才有效。
似乎对此有一个快速解决方案,如果括号后跟 {1},则它有效。
例如: [A-Za-z]{1}编译器:
Microsoft Visual Studio 社区 2019/版本 16.7.3/c++17
也在 c++14 中测试,同样的不良行为
预期结果:
enter image description here
我的结果:
enter image description here

最佳答案

不确定这是否是回答的适当用法。但这是一个已知的错误,看起来这个错误已经存在几个月了。据我所知,没有修复的预计到达时间。
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/

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