使用正则表达式在 C++ 中提取匹配的字符串

Posted

技术标签:

【中文标题】使用正则表达式在 C++ 中提取匹配的字符串【英文标题】:Extract matched strings in C++ with regex 【发布时间】:2013-08-02 11:09:20 【问题描述】:

我有以下测试字符串。

#5=BUILDING('xxxcdccx',#5,$,$,$,#21,$,$,.ELEMENT.,$,$,$);
#6=BUILDING('xxxcdccx',#5,$,$,$,#21,$,$,.ELEMENT.,$,$,$);
#7=BUILDING('xxxcdccx',#5,$,$,$,#21,$,$,.ELEMENT.,$,$,$);

我需要提取:

“#integer”(始终从字符串的开头开始)从上面的字符串中提取并将其存储在变量中。 上述测试字符串中“(”和“)”之间的字符串。

有人可以建议我如何使用正则表达式在 C++ 中实现这一点。

我尝试了以下简单示例(这是一个一次处理一行的循环):

std::regex e ("\#[:d:]+");
if (std::regex_match(sLine,e))
   //store it and process it

输出应该是:

#5

and

'xxxcdccx',#5,$,$,$,#21,$,$,.ELEMENT.,$,$,$ ?? (not sure)

【问题讨论】:

\#[:\d:]+ 试试这个来抓取 #digit 和 (? 目前我不知道有哪个编译器完全支持 std::regex 谢谢,@NisargShah 我应该使用其他函数的 regex_match 吗? 我不认为你需要逃避#(如果你这样做了,你需要2个\ )。我不确定[:d:] 应该是什么,如果C++ 遵循任何合理的正则表达式标准\\d 表示数字。哦,你应该改用regex_search Boost 有一些不错的正则表达式支持。 【参考方案1】:

说明

这个表达式将:

捕获初始# 和整数 捕获括号之间的值

^(\#\d+).*?\(([^)]*)\)

示例

Live Demo

示例文本

#5=BUILDING('xxxcdccx',#5,$,$,$,#21,$,$,.ELEMENT.,$,$,$);
#6=BUILDING('xxxcdccx',#5,$,$,$,#21,$,$,.ELEMENT.,$,$,$);
#7=BUILDING('xxxcdccx',#5,$,$,$,#21,$,$,.ELEMENT.,$,$,$);

捕获组

第 0 组获取整个匹配字符串 第 1 组获取 # 和整数 第 2 组获取括号之间的值

[0][0] = #5=BUILDING('xxxcdccx',#5,$,$,$,#21,$,$,.ELEMENT.,$,$,$)
[0][1] = #5
[0][2] = 'xxxcdccx',#5,$,$,$,#21,$,$,.ELEMENT.,$,$,$

[1][0] = #6=BUILDING('xxxcdccx',#5,$,$,$,#21,$,$,.ELEMENT.,$,$,$)
[1][1] = #6
[1][2] = 'xxxcdccx',#5,$,$,$,#21,$,$,.ELEMENT.,$,$,$

[2][0] = #7=BUILDING('xxxcdccx',#5,$,$,$,#21,$,$,.ELEMENT.,$,$,$)
[2][1] = #7
[2][2] = 'xxxcdccx',#5,$,$,$,#21,$,$,.ELEMENT.,$,$,$

【讨论】:

以上是关于使用正则表达式在 C++ 中提取匹配的字符串的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式分组与 C++ 11 正则表达式库匹配

正则表达式如何匹配提取括号中的内容

C++ 正则表达式提取子字符串

如何使用正则表达式从 C++ 字符串中提取字符串

使用正则表达式匹配和提取数据

使用正则表达式重新字符串匹配提取 URL 链接 - Python