注册 登录
编程论坛 C语言论坛

求助:正则表达式基本用法

追梦人zmrghy 发布于 2022-12-07 14:38, 853 次点击
求助:正则表达式基本用法

要求效果,如果路径字符串结未尾是'\\',就去除结未尾的'\\'
程序代码:

#include<iostream>
#include<regex>
using namespace std;

int main()
{
    string str1 = "C:\\Users\\Administrator\\Desktop\\JJDown\\Download";
    string str2 = "C:\\Users\\Administrator\\Desktop\\JJDown\\Download\\";
    regex re("(.*)\\{2}(.*)");
    cout << regex_replace(str1, re, "$1$2") << endl;
    cout <<  regex_replace(str2, re, "$1$2") << endl;
}


在RegexBuddy中测试"(.*)\\{2}(.*)",没有问题。
在VS2022 VC++中,不知出了什么问题。。。
反复测试过,只要正则表达式有有 '\\' 字符,就会出错。不知道是什么原因。
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录
9 回复
#2
rjsp2022-12-07 16:55
题主终于在C++论坛提问了一个C++相关的问题,难得!

"\\" 中第一个斜杠表示表示转义,所以你第一个图中,应该将\\改为\,代码中应该将\\改为\\\\
差不多是
程序代码:
#include <iostream>
#include <regex>
using namespace std;

int main()
{
    string str1 = "C:\\Users\\Administrator\\Desktop\\JJDown\\Download";
    string str2 = "C:\\Users\\Administrator\\Desktop\\JJDown\\Download\\";
    regex re( "(.*)\\\\(.*)" );
    cout << regex_replace(str1, re, "$1$2") << endl;
    cout << regex_replace(str2, re, "$1$2") << endl;
}

输出是
C:\Users\Administrator\Desktop\JJDownDownload
C:\Users\Administrator\Desktop\JJDown\Download
#3
追梦人zmrghy2022-12-08 01:28
回复 2楼 rjsp
谢谢,\\\\这个方法,我已经想到,可以去结尾的\\字符。
但是,结尾没有\\字符的,$1和$2之间的\\字符也被错误去除了。。

程序代码:

#include<iostream>
#include<regex>
using namespace std;

int main()
{
    string str1 = "C:\\Users\\Administrator\\Desktop\\JJDown\\Download";
    string str2 = "C:\\Users\\Administrator\\Desktop\\JJDown\\Download\\";
    regex re1(".*(.)");
    regex re2("(.*).");
    if(regex_replace(str1, re1, "$1")== "\\")
        cout << regex_replace(str1, re2, "$1") << endl;
    else
        cout << str1 << endl;

    if (regex_replace(str2, re1, "$1") == "\\")
        cout << regex_replace(str2, re2, "$1") << endl;
    else
        cout << str2 << endl;   
}


只有本站会员才能查看附件,请 登录
#4
rjsp2022-12-08 10:00
我只根据你的要求改,你的代码是……,改掉错误后结果就是……,这个结果奇怪与否我就无法置喙了
虽然 JJDownDownload 看起来应该是 JJDown\Download,但我只能认为你会在代码弄正确后自己去修改

如果你只是想用 regex_replace 去除结未尾的斜杠。在你源代码上改一下就是
程序代码:
#include <iostream>
#include <regex>
using namespace std;

int main( void )
{
    string str1 = "C:\\Users\\Administrator\\Desktop\\JJDown\\Download";
    string str2 = "C:\\Users\\Administrator\\Desktop\\JJDown\\Download\\";
    regex re( "[\\\\]+$" );
    cout << regex_replace(str1, re, "$1$2") << endl;
    cout << regex_replace(str2, re, "$1$2") << endl;
}


如果你只想去除未尾的斜杠,而不要求必须使用 regex_replace,那我肯定不用会regex这种低效且晦涩的东西
程序代码:
#include <iostream>
#include <string>
using namespace std;

int main( void )
{
    string str1 = "C:\\Users\\Administrator\\Desktop\\JJDown\\Download";
    string str2 = "C:\\Users\\Administrator\\Desktop\\JJDown\\Download\\";

    if( str1.ends_with('\\') )
        str1.erase( str1.size()-1 );
    if( str2.ends_with('\\') )
        str2.erase( str2.size()-1 );

    cout << str1 << endl;
    cout << str2 << endl;
}


如果你要按照路径的规则行事,而非简单看成一个字符串即可,那使用 std::filesystem 则是必须的
程序代码:
#include <iostream>
#include <filesystem>
using namespace std;

int main( void )
{
    string str1 = "C:\\Users\\Administrator\\Desktop\\JJDown\\Download";
    string str2 = "C:\\Users\\Administrator\\Desktop\\JJDown\\Download\\";

    auto normalized_path = []( const auto& path ) {
        auto p = std::filesystem::weakly_canonical(path);
        return p.has_filename() ? p.string() : p.parent_path().string();
    };

    cout << normalized_path(str1) << endl;
    cout << normalized_path(str2) << endl;
#5
追梦人zmrghy2022-12-09 03:14
回复 4楼 rjsp
在C++20标准下 string类中才有ends_with()成员函数
C++20 不支持CLI了,鱼和熊掌,只能选一个呀。
#6
rjsp2022-12-09 08:48
C++20 不支持CLI了,鱼和熊掌,只能选一个呀。
C++是国际标准组织的,C++/CLI是微软自己的,这两个语言之间没有一丝一毫的关系。
所以什么叫“C++20 不支持CLI了”?C++从来就不认识什么鸟玩意儿叫C++/CLI。
#7
追梦人zmrghy2022-12-09 14:57
回复 6楼 rjsp
对不起,描述有误。
应该说CLI不支持C++20标准,最高支持C++17。
#8
apull2022-12-09 17:19
看到2楼深以为然,到了5楼,不厚道的笑了
只去掉末尾的\,直接判断最后一个字符是否为\不是更好
#9
追梦人zmrghy2022-12-10 00:42
回复 8楼 apull
小黄人,好久不见。你还好吗?

原来,你是来看笑话的呀。。。。
#10
apull2022-12-10 08:51
好久不见。
C++/CLI 只是套了层C++皮的C#,你这相当于重新学一门语言,还不如直接学C#。
C#写操作窗体的代码要比C++/CLI舒服,C++/CLI太丑陋了,硬是把C++语法套到.net上,因此很多地方会非常别扭。
我没有安装C++/CLI,以前给你的代码都是写的C#,再把关键字那些转过去的。你已经有些C++/CLI的底子了,只需要稍微转一下就能掌握C#。
1