正则表达式模式怎么匹配字符串

这次给大家带来正则表达式模式怎么匹配字符串,正则表达式模式匹配字符串的注意事项有哪些,下面就是实战案例,一起来看一下。

 介绍

      在实际项目中有个功能的实现需要解析一些特定模式的字符串。而在已有的代码库中,在已实现的部分功能中,都是使用检测特定的字符,使用这种方法的缺点是:

逻辑上很容易出错

很容易漏掉对一些边界条件的检查

代码复杂难以理解、维护

性能差

      看到代码库中有一个cpp,整个cpp两千多行代码,有个方法里,光解析字符串的就有400余行!一个个字符对比过去,真是不堪入目。而且上面很多注释都已经过期,很多代码的书写风格也各不相同,基本可以判断是过了很多人手的。

      在这种情况下,基本没办法还沿着这条老路走下去,自然而然就想到了使用正则表达式。而我自己在正则表达式方面没有实际应用的经验,尤其是对于书写匹配规则也是一知半解。第一时间就想到从网上找点资料,先大致了解下。但是度娘的结果依旧还是让人很失望。(当然,如果是想要查找一些比较专业的知识,度娘的结果每次都会让人心碎,无不都是千篇一律的拷贝。但是通常度娘生活方面的还是可以)后来就放弃度娘的查询结果,FQ到了外面去找,也找到了一些比较基础的视频(需FQ)。

      这篇文章可以说是一个总结,把在书写正则表达式的匹配字符串方面的基础知识介绍一下。主要分为以下两个个部分:

匹配字符串的基本规则

正则匹配、查找与替代

本文介绍的正则表达式规则是ECMAScript。使用的编程语言是C++。其他方面的不做介绍。

匹配字符串的基本规则

1. 匹配固定的字符串

regex e(“abc”);

2. 匹配固定字符串,不区分大小写

regex e(“abc”, regex_constants::icase);

3. 匹配固定字符串之外多一个字符,不区分大小写

regex e(“abc.”, regex_constants::icase);  // .  Any character except newline. 1个字符

4. 匹配0个或1个字符

regex e(“abc?”);    // ?  Zero or 1 preceding character. 匹配?前一个字符

5. 匹配0个或多个字符

regex e(“abc*”);    // *  Zero or more preceding character. 匹配*前一个字符

6. 匹配1个或多个字符

regex e(“abc+”);    // +  One or more preceding character. 匹配+前一个字符

7. 匹配特定字符串中的字符

regex e(“ab[cd]*”);    // […] Any character inside square brackets. 匹配[]内的任意字符

8. 匹配非特定字符串的字符

regex e(“ab[^cd]*”);    // […] Any character not inside square brackets. 匹配非[]内的任意字符

9. 匹配特定字符串,且指定数量

regex e(“ab[cd]{3}”);    // {n}  匹配{}之前任意字符,且字符个数为3个

10. 匹配特定字符串,指定数量范围

regex e("ab[cd]{3,}");  // {n} 匹配{}之前任意字符,且字符个数为3个或3个以上regex e("ab[cd]{3,5}");  // {n} 匹配{}之前任意字符,且字符个数为3个以上,5个以下闭区间

登录后复制

11. 匹配规则中的某一个规则

regex e(“abc|de[fg]”);    // |  匹配|两边的任意一个规则

12. 匹配分组

regex e(“(abc)de+”);    // ()       ()表示一个子分组

13. 匹配子分组

regex e("(abc)de+\1");  // ()    ()表示一个子分组,而表示在此位置匹配第一个分组的内容regex e("(abc)c(de+)\2\1");  //  表示的是在此匹配第二个分组的内容

登录后复制

14. 匹配某个字符串开头

regex e("^abc."); // ^ begin of the string 查找以abc开头的子字符串

登录后复制

15. 匹配某个字符串结尾

regex e("abc.$");// $ end of the string 查找以abc结尾的子字符串

登录后复制

      以上是最基本的匹配模式的书写。通常如果要匹配特定的字符,需要使用进行转义,比如在匹配字符串中需要匹配”.”,那么在匹配字符串中应该在特定字符前加上。出了以上的基本规则,如果还不满足特定的需要,那么可以参考此链接。使用了解基本的匹配模式后,需要使用正则表达式进行匹配、查找或者替代。

正则匹配、查找与替代

      书写好模式字符串后,需要将待匹配的字符串和模式字符串进行一定规则的匹配。包括三种方式:匹配(regex_match)、查找(regex_search)、替换(regex_replace)。

      匹配很简单,直接将待匹配字符串和模式字符串传入到regex_match中,返回一个bool量来指明待匹配的字符串是否满足模式字符串的规则。匹配整个str字符串。

bool match = regex_match(str, e);// 匹配整个字符串str

登录后复制

      查找是在整个字符串中找到和满足模式字符串的子字符串。也就是只要str中存在满足模式字符串就会返回true。

bool match = regex_search(str, e);// 查找字符串str中匹配e规则的子字符串

登录后复制

      但是很多情况下,光是返回一个是否匹配的bool量是不够的,我们需要拿到匹配的子字符串。那么就需要在模式字符串中将匹配字符串分组,参考【匹配字符串的基本规则】第12点。再将smatch传入到regex_search中,就可以获得满足每个子分组的字符串。

smatch m;bool found = regex_search(str, m, e);for (int n = 0; n < m.size(); ++n)  {    cout << "m[" << n << "].str()=" << m[n].str() << endl;  }

登录后复制

    替换也是基于模式字符串在分组情况下完成的。

cout << regex_replace(str, e, "$1 is on $2");

登录后复制

      此时,会在满足分组1和分组2的字符串中间加上“ is on”。

      以上三个函数有很多版本的重载,可以满足不同情况下的需求。

实战

      要求:找出满足sectionA(“sectionB”)或者sectionA (“sectionB”)的模式字符串。且分离出sectionA、sectionB。sectionA和sectionB不会出现数字,字符可大小写,至少有一个字符。

      分析:根据要求,大致可分为两个部分,也就是sectionA和sectionaB。这是就需要用到分组。

第一步:写出满足section情况的模式字符串

[a-zA-Z]+

第二步:在sectionA和sectionB中可能会出现空格。暂且假设至多有1个空格

\s?

将以上两个情况组合起来,也就是能满足我们需求的模式字符串。但是如何组织才能让其分为两组呢?

[a-zA-Z]+\s[a-zA-Z]+

上面这种写法肯定不对的,根据分组规则,需要将分组以()进行区分

regex e(“([a-zA-Z]+)\s?\(“([a-zA-Z]+)”\)”);

      此时,在\s?后面的\(“是为了满足sectionB外层的引号和括号进行的转义。

      以上完成后,可先用regex_match进行匹配,如果匹配,那么继续使用regex_search对字符串进行查找

if (regex_match(str, e)){ smatch m; auto found = regex_search(str, m, e); for (int n = 0; n < m.size(); ++n) { cout << "m[" << n << "].str()=" << m[n].str() << endl; }}else{ cout << "Not matched" << endl;}

登录后复制

      对象m数组的第一个字符串是满足需求的整个子串,接下来才是满足分组1、分组2的子串。

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

正则表达式的D元字符(等价于”[^0-9]”)使用详解

正则的元字符和普通字符

以上就是正则表达式模式怎么匹配字符串的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2778170.html

(0)
上一篇 2025年3月8日 15:20:08
下一篇 2025年3月8日 15:20:16

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • lastIndex与正则表达式的关系

    这次给大家带来lastIndex与正则表达式的关系,使用lastIndex与正则表达式的注意事项有哪些,下面就是实战案例,一起来看一下。 前言 今天遇到一个问题,用正则表达式去检查同一个字符串时,交替返回true和false。无奈之下,重新…

    编程技术 2025年3月8日
    200
  • PHP正则表达式(增加177手机号)

    这次给大家带来PHP正则表达式(增加177手机号),使用PHP正则表达式(增加177手机号)的注意事项有哪些,下面就是实战案例,一起来看一下。 首先看下正则表达式思维导图: 一、校验数字的表达式  1 数字:^[0-9]*$2 n位的数字:…

    2025年3月8日
    200
  • JS的正则表达式概念与实战应用

    这次给大家带来JS的正则表达式概念与实战应用,使用JS正则表达式概念与实战应用的注意事项有哪些,下面就是实战案例,一起来看一下。 今天和大家分享一些关于正则表达式的知识和在javascript中的应用。正则表达式简单却又不简单,比如以前我的…

    2025年3月8日 编程技术
    200
  • Replace中的正则表达式使用详解

    这次给大家带来Replace中的正则表达式使用详解,使用Replace中正则表达式的注意事项有哪些,下面就是实战案例,一起来看一下。 replace:把原有的字符替换成新的字符 1. replace的字符串替换 var str = ‘pku…

    编程技术 2025年3月8日
    200
  • 实现日期正则表达式详解

    这次给大家带来实现日期正则表达式详解,实现日期正则表达式的注意事项有哪些,下面就是实战案例,一起来看一下。 1        概述 首先需要说明的一点,无论是Winform,还是Webform,都有很成熟的日历控件,无论从易用性还是可扩展性…

    编程技术 2025年3月8日
    200
  • 用正则表达式验证登录页面的输入内容

    这次给大家带来用正则表达式验证登录页面的输入内容,用正则表达式验证登录页面输入内容的注意事项有哪些,下面就是实战案例,一起来看一下。 先给大家展示下效果图: 废话不多说了,直接给大家贴代码了,具体代码如下所示: $(function() {…

    2025年3月8日
    200
  • Linux grep与正则表达式的使用

    这次给大家带来Linux grep与正则表达式的使用,Linux grep与正则表达式使用的正则表达式有哪些,下面就是实战案例,一起来看一下。 grep简介   grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打…

    编程技术 2025年3月8日
    200
  • 怎样使用正则表达式屏蔽所选关键字

    这次给大家带来怎样使用正则表达式屏蔽所选关键字,使用正则表达式屏蔽所选关键字的注意事项有哪些,下面就是实战案例,一起来看一下。 【问题】关键字屏蔽是社交类软件必做的功能,当然了,一般来讲都是产品的中后期来做;不同产品规定不一样,跟着产品运营…

    编程技术 2025年3月8日
    200
  • 前端常用的正则表达式有哪些

    这次给大家带来前端常用的正则表达式有哪些,使用前端常用正则表达式的注意事项有哪些,下面就是实战案例,一起来看一下。 前言 正则这东西吧,感觉是开发的都会接触到一些.. 那些所谓的基础语法就不说了哈,一搜一大把,来点实际的. 我这里就分享下我…

    编程技术 2025年3月8日
    200
  • 在正则表达式中wd的使用详解

    这次给大家带来在正则表达式中wd的使用详解,使用正则表达式中的wd注意事项有哪些,下面就是实战案例,一起来看一下。 对于正则表达式,相信很多人都知道,但是很多人的第一感觉就是难学,因为看第一眼时,觉得完全没有规律可寻,而且全是一堆各种各样的…

    2025年3月8日
    200

发表回复

登录后才能评论