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 sequence
和s
和d
相同。但从文档中我的印象是我可以使用'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, "");
您可以在正则表达式中使用'w
、's
和'd
。然而,这不是你在做的;您正在尝试使用'w
作为字符串中的字符。为了在实际字符串中出现'
和w
,您需要转义'
(当然,s
和d
也一样):
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");