使用正则表达式在 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++ 中提取匹配的字符串的主要内容,如果未能解决你的问题,请参考以下文章