这个std::regex正则表达式怎么写?

智能牛蛙 2019-09-06 02:58:55
std::string "![CDATA[123456abcdef]]" ;

想用std::regex取出CDATA[ 之后的那串字符串, 正则表达式应该怎么写呢? 自己写的在其他语言可以取到,但是用std::regex总是崩溃
...全文
306 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
智能牛蛙 2019-09-07
  • 打赏
  • 举报
回复
引用 7 楼 uouo88 的回复:
[quote=引用 5 楼 山岭巨人郭敬明 的回复:]
[quote=引用 4 楼 uouo88 的回复:]
测试结果如下图,希望对你有帮助:


谢谢大兄弟,我自己后来也匹配到了,跟你这个好像,也是取第二个。 有没有直接匹配到第一个就是的呢? ?<=这个真的无法识别到吗[/quote]

没太明白你说的“有没有直接匹配到第一个就是的呢?”,如果要完整匹配,把下面这句改下就可以了:
cout << results.str(1) << endl;
=>
cout << results.str(0) << endl;[/quote]

就是说匹配的结果只能有一个,就是中括号内的字符串。 你说的加\\转义符我试过了,,没有效果
uouo88 2019-09-07
  • 打赏
  • 举报
回复
如果你要识别“?<=”这些字符,需要在前面加两个反斜杠作为转义符
uouo88 2019-09-07
  • 打赏
  • 举报
回复
引用 5 楼 山岭巨人郭敬明 的回复:
[quote=引用 4 楼 uouo88 的回复:]
测试结果如下图,希望对你有帮助:


谢谢大兄弟,我自己后来也匹配到了,跟你这个好像,也是取第二个。 有没有直接匹配到第一个就是的呢? ?<=这个真的无法识别到吗[/quote]

没太明白你说的“有没有直接匹配到第一个就是的呢?”,如果要完整匹配,把下面这句改下就可以了:
cout << results.str(1) << endl;
=>
cout << results.str(0) << endl;
智能牛蛙 2019-09-07
  • 打赏
  • 举报
回复
引用 1 楼 七静安 的回复:
(?<=CDATA\[)([\s\S]*)

(?<=CDATA\[) 是以"CDATA["开头但包含"CDATA[",([\s\S]*)是匹配任意字符任意多个

但是C++里好像识别不出?<=,很气。

是啊。。。
智能牛蛙 2019-09-07
  • 打赏
  • 举报
回复
引用 4 楼 uouo88 的回复:
测试结果如下图,希望对你有帮助:


谢谢大兄弟,我自己后来也匹配到了,跟你这个好像,也是取第二个。 有没有直接匹配到第一个就是的呢? ?<=这个真的无法识别到吗
uouo88 2019-09-06
  • 打赏
  • 举报
回复
测试结果如下图,希望对你有帮助:
uouo88 2019-09-06
  • 打赏
  • 举报
回复

#include <regex>
int main()
{
try
{
regex r("^!\\[CDATA\\[([a-zA-Z0-9]*)\\]\\]$", regex_constants::icase); //匹配以 "![CDATA[" 开头并以 "]]"结尾的,中间为数字、大写字母、小写字母的组合的值。
cmatch results;
char filename[255] = "![CDATA[123456abcdef]]";

if (regex_search(filename, results, r))
cout << results.str(1) << endl; //取第2个匹配分组的值"123456abcdef",注:第1个匹配的是整个表达式,即"![CDATA[123456abcdef]]"
} //([a-zA-Z0-9]*)前后的小括号表示一个子表达式分组。
catch (const std::regex_error& e)
{
cout << e.what() << "\nCode:" << e.code() << endl;
}
}
uouo88 2019-09-06
  • 打赏
  • 举报
回复
C++里面正则表达式的套路大概如下,正则表达式内容你自己替换下


try
{
regex r("[[:alnum:]]+\\.(cpp|cxx|cc)$", regex_constants::icase);
cmatch results;
char filename[255];
while (cin >> filename)
{
if (regex_search(filename, results, r))
cout << results.str() << endl;
}
}
catch (const std::regex_error& e)
{
cout << e.what() << "\nCode:" << e.code() << endl;
}


舒泱 2019-09-06
  • 打赏
  • 举报
回复
(?<=CDATA\[)([\s\S]*)

(?<=CDATA\[) 是以"CDATA["开头但包含"CDATA[",([\s\S]*)是匹配任意字符任意多个

但是C++里好像识别不出?<=,很气。

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧