C# Regex to C++ boost::regex

C# Regex to C++ boost::regex

本文关键字:regex boost C++ Regex to      更新时间:2023-10-16

我需要匹配形式为

的c++代码中的字符串
L, N{1, 3}, N{1, 3}, N{1, 3} 

,其中在上述伪代码中,L总是一个字母(大写或小写)一个句号(.字符),N总是数字[0-9]

因此,显式地,我们可能有B, 999, 999, 999., 8, 8, 8,但每个,之后的数字字符数总是相同的,长度为1、2或3位;所以D, 23, 232, 23 可能。

在c#中,我将像下面这样匹配

string s = "   B,801, 801, 801 other stuff";
Regex reg = new Regex(@"[.w],s*d{1,3},s*d{1,3},s*d{1,3}");
Match m = reg.Match(s);

好了。然而,我需要一个类似的正则表达式使用boost::regex

std::string s = "   B,801, 801, 801 other stuff";
boost::regex regex("[\.w],s*d{1,3},s*d{1,3},s*d{1,3}");
boost::match_results<std::string::const_iterator> results;
boost::regex_match(s, results, regex);

,但这是给我'w' : unrecognized character escape sequencesd相同。但从文档中我的印象是我可以使用d, sw没有问题。

我这里做错了什么?


编辑。根据上面的评论,我已经切换到std::regex。现在,假设正则表达式是相同的,下面的编译但是正则表达式匹配…

std::string p = "XX";
std::string s = "    B,801, 801, 801 other stuff";
std::regex regex(R"del([.w],s*d{1,3},s*d{1,3},s*d{1,3})del");
if (std::regex_match(s, regex))
   p = std::regex_replace(s, regex, "");

您可以在正则表达式中使用wsd。然而,这不是你在做的;您正在尝试使用w作为字符串中的字符。为了在实际字符串中出现w,您需要转义(当然,sd也一样):

boost::regex regex("[\.\w],\s*\d{1,3},\s*\d{1,3},\s*\d{1,3}");

从c++ 11开始,您可以使用原始字符串字面值使代码更类似于c#版本:

boost::regex regex(R"del([.w],s*d{1,3},s*d{1,3},s*d{1,3})del");