首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >由一半捕获的正则表达式+组上的C++未知转义序列

由一半捕获的正则表达式+组上的C++未知转义序列
EN

Stack Overflow用户
提问于 2020-08-25 08:19:20
回答 1查看 41关注 0票数 0

我正在尝试使用以下正则表达式

代码语言:javascript
运行
复制
(https?|rtsp):\/\/(?:([^\s@\/]+?)[@])?([^\s\/:]+)(?:[:]([0-9]+))?(?:(\/[^\s?#]+)([?][^\s#]+)?)?([#]\S*)?

在C++上,如下所示:

代码语言:javascript
运行
复制
#include <iostream>
#include <string>
#include <regex>

int main() {
    std::string str("rtsp://3333:1232@hellowebsite.com:2222");
    std::regex r("(https?|rtsp):\/\/(?:([^\s@\/]+?)[@])?([^\s\/:]+)(?:[:]([0-9]+))?(?:(\/[^\s?#]+)([?][^\s#]+)?)?([#]\S*)?");
    std::smatch m;
    std::regex_search(str, m, r);
    std::cout << str << std::endl;
    for(auto v: m) std::cout << v << std::endl;
  }

匹配rtsp或http URL,但这是编译+运行的输出:

代码语言:javascript
运行
复制
main.cpp:7:33: warning: unknown escape sequence '\/' [-Wunknown-escape-sequence]
    std::regex r("(https?|rtsp):\/\/(?:([^\s@\/]+?)[@])?([^\s\/:]+)(?:[:]([0-9]+))?(?...
                                ^~
main.cpp:7:35: warning: unknown escape sequence '\/' [-Wunknown-escape-sequence]
    std::regex r("(https?|rtsp):\/\/(?:([^\s@\/]+?)[@])?([^\s\/:]+)(?:[:]([0-9]+))?(?...
                                  ^~
main.cpp:7:43: warning: unknown escape sequence '\s' [-Wunknown-escape-sequence]
    std::regex r("(https?|rtsp):\/\/(?:([^\s@\/]+?)[@])?([^\s\/:]+)(?:[:]([0-9]+))?(?...
                                          ^~
main.cpp:7:46: warning: unknown escape sequence '\/' [-Wunknown-escape-sequence]
    std::regex r("(https?|rtsp):\/\/(?:([^\s@\/]+?)[@])?([^\s\/:]+)(?:[:]([0-9]+))?(?...
                                             ^~
main.cpp:7:60: warning: unknown escape sequence '\s' [-Wunknown-escape-sequence]
    std::regex r("(https?|rtsp):\/\/(?:([^\s@\/]+?)[@])?([^\s\/:]+)(?:[:]([0-9]+))?(?...
                                                           ^~
main.cpp:7:62: warning: unknown escape sequence '\/' [-Wunknown-escape-sequence]
    std::regex r("(https?|rtsp):\/\/(?:([^\s@\/]+?)[@])?([^\s\/:]+)(?:[:]([0-9]+))?(?...
                                                             ^~
main.cpp:7:88: warning: unknown escape sequence '\/' [-Wunknown-escape-sequence]
  ...r("(https?|rtsp):\/\/(?:([^\s@\/]+?)[@])?([^\s\/:]+)(?:[:]([0-9]+))?(?:(\/[^\s?#]+)([...
                                                                             ^~
main.cpp:7:92: warning: unknown escape sequence '\s' [-Wunknown-escape-sequence]
  ...r("(https?|rtsp):\/\/(?:([^\s@\/]+?)[@])?([^\s\/:]+)(?:[:]([0-9]+))?(?:(\/[^\s?#]+)([...
                                                                                 ^~
main.cpp:7:105: warning: unknown escape sequence '\s' [-Wunknown-escape-sequence]
  ...\s#]+)?)?([#]\S*)?");
     ^~
main.cpp:7:118: warning: unknown escape sequence '\S' [-Wunknown-escape-sequence]
  ...\S*)?");
     ^~
10 warnings generated.
 ./main
rtsp://3333:1232@hellowebsite.com:2222
rtsp://3333:1232@helloweb
rtsp
3333:1232
helloweb

检查here..

首先,为什么我会得到未知的转义序列?\\\s等都是众所周知的。

最重要的是,为什么我会得到这些未完成的组?它在regex在线测试人员上运行良好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-25 08:28:48

尤其是当你在做正则表达式的时候,原始字符串字面值是你的朋友。因此,作为起点,我会这样做:

代码语言:javascript
运行
复制
std::regex r(R"--((https?|rtsp):\/\/(?:([^\s@\/]+?)[@])?([^\s\/:]+)(?:[:]([0-9]+))?(?:(\/[^\s?#]+)([?][^\s#]+)?)?([#]\S*)?)--");

如果您确实不想使用原始字符串文字,那么首先要注意的是,C++字符串中的反斜杠引入了转义序列,因此当您希望文字实际包含反斜杠时,您需要在一行中使用两个反斜杠字符,因此(至少)您需要转换这些字符,因此它开始如下所示:

代码语言:javascript
运行
复制
std::regex r("(https?|rtsp):\\/\\/(?:

它包含的所有其他反斜杠的...continuing。在那之后可能还有更多的事情要做,但这是显而易见的最低限度的你需要做的事情。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63570314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档