我正在尝试使用以下正则表达式
(https?|rtsp):\/\/(?:([^\s@\/]+?)[@])?([^\s\/:]+)(?:[:]([0-9]+))?(?:(\/[^\s?#]+)([?][^\s#]+)?)?([#]\S*)?在C++上,如下所示:
#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,但这是编译+运行的输出:
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在线测试人员上运行良好。
发布于 2020-08-25 08:28:48
尤其是当你在做正则表达式的时候,原始字符串字面值是你的朋友。因此,作为起点,我会这样做:
std::regex r(R"--((https?|rtsp):\/\/(?:([^\s@\/]+?)[@])?([^\s\/:]+)(?:[:]([0-9]+))?(?:(\/[^\s?#]+)([?][^\s#]+)?)?([#]\S*)?)--");如果您确实不想使用原始字符串文字,那么首先要注意的是,C++字符串中的反斜杠引入了转义序列,因此当您希望文字实际包含反斜杠时,您需要在一行中使用两个反斜杠字符,因此(至少)您需要转换这些字符,因此它开始如下所示:
std::regex r("(https?|rtsp):\\/\\/(?:它包含的所有其他反斜杠的...continuing。在那之后可能还有更多的事情要做,但这是显而易见的最低限度的你需要做的事情。
https://stackoverflow.com/questions/63570314
复制相似问题