| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 714 人关注过本帖
标题:求助:正则表达式基本用法
只看楼主 加入收藏
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:406
专家分:190
注 册:2021-4-9
结帖率:97.26%
收藏
已结贴  问题点数:20 回复次数:9 
求助:正则表达式基本用法
求助:正则表达式基本用法

要求效果,如果路径字符串结未尾是'\\',就去除结未尾的'\\'
程序代码:
#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++中,不知出了什么问题。。。
反复测试过,只要正则表达式有有 '\\' 字符,就会出错。不知道是什么原因。
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: string Users 正则表达式 Desktop 用法 
2022-12-07 14:38
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
题主终于在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
2022-12-07 16:55
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:406
专家分:190
注 册:2021-4-9
收藏
得分:0 
回复 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;    
}


图片附件: 游客没有浏览图片的权限,请 登录注册
2022-12-08 01:28
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:20 
我只根据你的要求改,你的代码是……,改掉错误后结果就是……,这个结果奇怪与否我就无法置喙了
虽然 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;
2022-12-08 10:00
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:406
专家分:190
注 册:2021-4-9
收藏
得分:0 
回复 4楼 rjsp
在C++20标准下 string类中才有ends_with()成员函数
C++20 不支持CLI了,鱼和熊掌,只能选一个呀。
2022-12-09 03:14
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
C++20 不支持CLI了,鱼和熊掌,只能选一个呀。
C++是国际标准组织的,C++/CLI是微软自己的,这两个语言之间没有一丝一毫的关系。
所以什么叫“C++20 不支持CLI了”?C++从来就不认识什么鸟玩意儿叫C++/CLI。
2022-12-09 08:48
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:406
专家分:190
注 册:2021-4-9
收藏
得分:0 
回复 6楼 rjsp
对不起,描述有误。
应该说CLI不支持C++20标准,最高支持C++17。
2022-12-09 14:57
apull
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:三体星系
等 级:版主
威 望:216
帖 子:1506
专家分:9241
注 册:2010-3-16
收藏
得分:0 
看到2楼深以为然,到了5楼,不厚道的笑了
只去掉末尾的\,直接判断最后一个字符是否为\不是更好
2022-12-09 17:19
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:406
专家分:190
注 册:2021-4-9
收藏
得分:0 
回复 8楼 apull
小黄人,好久不见。你还好吗?

原来,你是来看笑话的呀。。。。
2022-12-10 00:42
apull
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:三体星系
等 级:版主
威 望:216
帖 子:1506
专家分:9241
注 册:2010-3-16
收藏
得分:0 
好久不见。
C++/CLI 只是套了层C++皮的C#,你这相当于重新学一门语言,还不如直接学C#。
C#写操作窗体的代码要比C++/CLI舒服,C++/CLI太丑陋了,硬是把C++语法套到.net上,因此很多地方会非常别扭。
我没有安装C++/CLI,以前给你的代码都是写的C#,再把关键字那些转过去的。你已经有些C++/CLI的底子了,只需要稍微转一下就能掌握C#。
2022-12-10 08:51
快速回复:求助:正则表达式基本用法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024674 second(s), 12 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved