C++ 正则表达式

正则表达式使用符号表示一类字符串,以实现批量处理字符串的效果。C++ string没有提供正则表达式,而是以C++正则表达式库形式提供的。

C++正则表达式分为Match(匹配)、Search(搜索)、Tokenize(分词)、Replace(替换)四部分。

正则表达式语法

C++支持的正则表达式语法如下:

ECMAScript  //默认语法
awk
grep
egrep
basic 
extended

ECMAScript常用语法如下:

/* 匹配次数 */
*	     //匹配任意次前面字符,>=0
+	     //至少匹配1次前面字符,>=1
?	     //至多匹配1次前面字符,可有可无,<=1

/* 匹配位置 */
^	     //匹配行首
$	     //匹配行尾
\b	     //匹配边界,不匹配字符

/* 匹配内容 */
\w, \W	     //匹配字母[a-z]、数字、下划线,取反
\d, \D       //匹配数字[0-9],取反
\r, \n, \t   //换行符、回车键、tab键
\s, \S	     //匹配空格,取反
.	         //任意字符,除换行符
[]	         //匹配[]中的任意字符
[^]	     //不匹配[]中的任意字符
[[:alnum:]]  //字母或数字
[[:alpha:]]  //字母
[[:lower:]]  //小写字母
[[:upper:]]  //大写字母
[[:princt:]] //标点符号
[[:blank:]]  //空格或tab
[[:space:]]  //空白字符
[[:cntrl:]]  //控制符
[[:digit:]]  //数字
[[:xdigit:]] //十六进制数字
[[:print:]]  //可打印字符,包括空白
[[:graph:]]  //可打印字符,除空白

/* 分组 */
|	     // 逻辑或
()	     //设定分组
\1	     //代表第1组内容
{}	     //重复表达式n次

可以通过传入语法类型来指定使用的正则语法:

regex_match(s,reg,regex_constants::grep);

全词匹配

#include <regex>
string s;
regex reg;

regex_match(s,reg);

子串搜索

搜索子串:

#include <regex>
bool res;
string s;
regex reg;
smatch m; // smatch、cmatch、wsmatch、wcmatch

regex_search(s,reg); //只判断是否存在
regex_search(s,m,reg); //判断是否存在,并返回匹配信息

m.str() //返回所有匹配内容
m.size() //返回匹配个数
m[n].str() //组n的内容
m.str(n) //组n的内容
m.prefix().str() //组1前的内容
m.suffix().str() //最后一组后的内容
m.positon(n) //组n的位置

遍历匹配结果:

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

int main(){
    string s("tag: <head1>mmmm</head1> <href>alading</href> binggo! <head>nnnnn</head> end!");
    regex reg("<(.*)>(.*)</(\\1)>");

    sregex_iterator beg(s.cbegin(), s.cend(), reg);
    sregex_iterator end;

    for_each(beg,end,[](const smatch& m){
        cout << m.str() << endl;
        cout << m.str(1) << endl;
        cout << m.str(2) << endl;
    });
    
    return 0;
}

相同词汇的第一次匹配:

#include <iostream>
#include <string>
#include <regex>

using namespace std;

int main() {
    string s("tag: <head>mmmm</head> <href>alading</href> binggo! <head>nnnnn</head> end!");
    regex reg("<([^>]*)>([^<]*)</\\1>");
    smatch match;

    if (regex_search(s, match, reg)) {
        cout << "Matched tag: " << match[0] << endl;
        cout << "Opening tag: " << match[1] << endl;
        cout << "Content: " << match[2] << endl;
    } else {
        cout << "No match found." << endl;
    }

    return 0;
}

子串分割

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

int main(){
    string s("alian, bob, conda, davi");
    regex reg("[ \t\n]*[;,.][ \t\n]*");

    sregex_token_iterator beg(s.cbegin(),s.cend(),reg,-1); //-1表示不带分词符,0表示带分词符,n表示提取第n个
    sregex_token_iterator end;

    for(; beg != end; beg++){
        cout << *beg << endl;
    }
    
    return 0;
}

子串替换

将匹配到的词,替换掉

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

int main(){
    string s("tag: <head1>mmmm</head1> <href>alading</href> binggo! <head>nnnnn</head> end!");
    regex reg("<(.*)>(.*)</(\\1)>");
    string target(R"({$1 $2})");

    string t = regex_replace(s,reg,target);
    cout << t << endl;
    return 0;
}

注意,这里的占位符使用的是$符号,如果想和sed一样使用\1,则需要传入regex_constants::format_sed

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在 C 语言中,运行正则表达式可能会卡住的原因可能有很多。其中一个原因可能是使用的正则表达式引擎在处理复杂的正则表达式时可能会出现“超时”的情况。 正则表达式是一种用来匹配文本模式的工具,它通常被用来在大型文本中搜索或替换特定的字符串。但是,如果正则表达式非常复杂或者匹配的文本非常大,那么使用正则表达式引擎处理这些表达式可能会占用大量的 CPU 时间,导致程序“卡住”。 此外,如果正则表达式中包含了一些“不优雅”的模式(例如,匹配的字符串中包含大量的重复字符),也可能会导致程序卡住。在这种情况下,可以尝试使用更有效的正则表达式来解决问题。 总的来说,如果你的程序在运行正则表达式时“卡住”,那么最好的解决办法就是尝试优化你的正则表达式,或者使用更快的正则表达式引擎来处理这些表达式。 ### 回答2: 运行正则表达式会卡住可能有以下几个原因: 1. 正则表达式的匹配模式过于复杂。某些正则表达式可能包含大量的逻辑判断、重复项匹配或回溯等操作,这会导致匹配过程非常耗时,进而导致卡顿。 2. 被匹配的文本过长或包含大量的匹配项。如果待匹配的文本非常庞大或者包含大量的匹配项,正则引擎需要不断地尝试不同的匹配组合,消耗大量的计算资源和时间,从而导致卡顿问题的产生。 3. 缺乏优化。有些正则表达式可能并没有经过充分的优化,导致在执行时效率低下。可以通过使用更精确的匹配规则、避免使用贪婪匹配、减少回溯等方法来优化正则表达式的性能。 4. 正则表达式引擎的实现问题。某些情况下,正则表达式引擎的实现可能存在漏洞或性能问题,导致在匹配过程中出现卡顿现象。 为避免正则表达式卡住的问题,可以尝试以下解决方案: 1. 对复杂的正则表达式进行简化或优化,避免不必要的重复匹配或回溯操作。 2. 尽量减少待匹配的文本长度,或者通过分块的方式进行匹配,减少单个匹配操作的复杂度。 3. 使用更高效的正则表达式引擎或库,可以选择一些经过性能优化的库来提升匹配速度。 4. 针对具体情况,可以考虑采用其他方法,如字符串操作或自定义解析器等,来代替正则表达式进行文本匹配。 综上所述,正则表达式可能会卡住的原因有多种,解决方法也因情况而异。需要根据具体情况分析和优化,以提高正则表达式的运行效率。 ### 回答3: C运行正则表达式卡住的原因可能有以下几点: 1. 正则表达式本身复杂度高:某些复杂的正则表达式可能会导致运行时间较长。正则表达式引擎需要逐个字符地匹配输入文本,如果正则表达式中包含多个嵌套的量词、回溯、或者复杂的匹配规则,会增加匹配的时间复杂度。 2. 输入文本过长:如果输入的文本非常大,比如几百兆或几个G的文本,正则表达式引擎需要逐个字符地遍历每个字符进行匹配,这样耗时较长,可能导致卡顿。 3. 正则表达式与输入文本不匹配:有时,正则表达式与输入文本不匹配会导致卡住的现象。正则表达式引擎会尝试所有可能的匹配,当正则表达式无法匹配到整个输入文本时,可能会进入无限循环或者时间复杂度较高的模式,造成运行卡住。 解决这个问题的方法可以有以下几种: 1. 优化正则表达式:简化或重写复杂的正则表达式,减少回溯和匹配次数,使用更高效的匹配语法。 2. 分割输入文本:如果输入文本过长,可以考虑将文本分割成小块逐个进行正则表达式匹配,降低时间复杂度。 3. 使用其他方法替代正则表达式:对于某些场景,可以考虑使用字符串处理函数或其他更高效的方式替代正则表达式匹配。 总之,正则表达式运行卡住可能是由于正则表达式本身复杂度高、输入文本过长或正则表达式与文本不匹配等原因造成的。要解决这个问题,可以优化正则表达式、分割文本或者使用其他方式替代正则表达式匹配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多弗朗强哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值