C# Regex to C++ boost::regex

本文关键字:regex boost C++ Regex to | 更新日期: 2023-09-27 18:09:15

我需要匹配形式为

的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, 's'w没有问题。

我这里做错了什么?


编辑。根据上面的评论,我已经切换到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, "");

C# Regex to C++ boost::regex

您可以在正则表达式中使用'w's'd。然而,这不是你在做的;您正在尝试使用'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");