热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我学习正则表达式的笔记

一、正则表达式的语法要灵活运用正则表达式,必须了解其中各种元字符的功能,元字符从功能上大致分为:1,限定符2,

一、正则表达式的语法
要灵活运用正则表达式,必须了解其中各种元字符的功能,元字符从功能上大致分为:
  1,限定符
 2,选择匹配符
 3,分组组合和反向引用符
 4,特殊字符
 5,字符匹配符
 6,定位符

限定符:用于指定前面的字符或组合项连续出现多少次。
1,{n}
举例说明:“o{2}”不能与“Bob”中的“o”匹配,但可以与“food”中的两
个“o”匹配,也可与“fooood”中的任意两个连续的“o”匹配。
2,{n,}
举例说明:“o{2,}”不能与“Bob”中的“o”匹配,但可以与“foooood”中的所有
的“o”匹配。
3,{n,m}
举例说明:“o{1,3}”既可匹配“food”中的两个“o”,又可匹配“fooood”中的
连续的三个“o”。
4,+ (前面的元素或组合项至少出现一次)
举例说明:“zo+”与“zo”和“zoo”等在字母之z后面连续出现一个或多个字母
O的字符串匹配。(等效如{1,})
5, *(前面的元素或组合项至少出现0次或多次)
举例说明:zo*与“z”和“zoo”都能匹配。*等效于{0,}。
6,?(规定前面的元素或组合项出现0次或1次)
举例说明:“zo?”可以匹配“z”或“zo”,也可以匹配“zoo”中的“zo”部分
,但不能匹配整个“zoo”。(等效于(0,1))


贪婪匹配与非贪婪匹配
1. 贪婪匹配
默认情况下,正则表达式使用最长(也叫贪婪)匹配原则。例如,要将
“zoom”中匹配“zo?”的部分替换成“r”,替换后的结果是“rom”
不是“room”;如果要将“zoom”中匹配“zo”部分替换成“r”,替换后的结果
是“rm”,不是“rom”或“room”。
2. 非贪婪匹配
当字符“?”紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,
匹配模式变成使用最短(也叫非贪婪)匹配原则。例如,在字符串“fooood”
中,“fo+?”只匹配“fo”部分,而“fo+”匹配“foooo”部分。


选择匹配符:
选择匹配符只有一人,就是“|”字符,用于选择匹配两个选项之中的任意一个,
它的两个选项是“|”字符两边的尽可能最大的表达式。
     举例说明:
         “chapter|section 1”匹配的是“chapter”或“section 1”,而不是
          “chapter 1”或“section 1”;如果要匹配“chapter 1”或“section 1”,
           应该使用括号创建子表达式,即“(chapter|section)1”。

 

分组组合和反向引用符:
    分组组合符:将正则表达式中的某一部分内容组合起来的符号。
    反向引用符:用于匹配前面的分组组合所捕获到的内容的标识符号。

   
• (pattern)(存入缓冲区)
     说明:若要匹配字面意义的括号字符“(”和“)”,在正则表达式中要分别
     使用“/(”和“/)”。
•  /num
     举例说明:要匹配连续的5个数字字符,可以使用/d{5}作为是正则表达式文本
     但是,要匹配连续的的5个相同的数字字符,需要使用(/d)/1{4}作为正则表达式文本。要匹配“Is is the cost of of gasoline going up up?”中所有连续重复的单词部分,可以使用//b([a-z]+)/1/b/gi作为正则表达式文本。
•  (?:patterm)(不存入缓冲区)
     举例说明:不能将“industry|industries”简单地改写成“industr(y|ies)”,
     如果不需要引用或检索括号中的表达式所匹配的结果,最好还是改写成“industr(?:y|ies)”。
•   (?=pattern) 
      正向“预测先行”匹配
      举例说明:使用“Windows(?=NT|2000)”作为正则表达式模式,它只与“Windows 2000”或“Windows NT”中的“Windows”匹配,而不与“Windows 2003”中的“Windows”匹配。
       ?多想一想:以“Windows(?=NT|2000)Series”作为正则表达式模式,在文本“My Windows NT Series”中的匹配结果是多少呢?

•   (?!pattern)
      反向“预测先行”匹配
      举例说明:使用“Windows(?!NT|2000)”作为正则表达式,它不与“Windows 2000”或“Windows NT”中的“Windows”匹配,而可以与“Windows 2003”中的“Windows”匹配。


特殊字符
       正则表达式中以反斜杠字符(/)后紧跟其它转义字符序列来表示非打印
       字符和原义字符。
    
     •   /xn
            ASCⅡ码值等于n的字符,这里的 n必须是两位的十六进制数
举例说明:“/x41”匹配字符“A”。注意:“/x041”所表示的字符
            后跟字符“1”。
      •     /n
             要求这里的n(0-7)是一个一位的八进制数,如果这里的n前面至少
             有n个捕获子匹配,那么这个斜杠n它就是被用作反向引用,否则它就是被
             用作匹配ASCII码值等于这个n的字符
      •     /nm
              这里的m和n都是一位的八进制数如果在这个表达式的前面至少有nm个捕获子表达式,那么这个格式就是反向引用,如果前面至少有n个捕获,那么这个表达式的/n部分就是反向引用,那么后面m就是字面意义上的数字字符了,如果刚才说的那些条件都不存在,那么它才是匹配ASCII码的值的八进制形式等于nm的那个字符
      •     /nml
              当n是0到3之间的八进制数和m和l是0到7之间的八进制数的时候,它才能匹配ASCII码值的八进制形式等于nml的那个字符。
      •     /un
              用来匹配Unicode码等于n的字符,这里的n必须是一个四位的十六进制数据
              举例说明:/u00A9匹配版权符号。
      •     /CX
              匹配由X所指定的控制字符。这个X的值必须是大写的A到Z或
              小写的a到z之间的一个字符,否则这个C完全是字面意义上的字符
               C本身,X是原来的字符意义了,而不再表示控制字符了
              举例说明:/cM匹配Control+M表示的控制字符,也就是回车符。
      •     /f 
              匹配换页符,等效于/x0c和/cL。
      •     /n
              匹配换行符,等效于/x0a和/cJ。
      •     /r
              匹配回车符,等效于/x0d和/cM。
      •     /t
              匹配制表符,等效于/x09和/cl。
      •     /v
              匹配垂直制表符,等效于/x0b和/cK。

字符匹配符
字符匹配符:用于指定该符号部分可以匹配多个字符中的任意一个。
• […]
说明:如果字符集中要包含“]”字符,需要将它放在第一位,即紧跟在开始“[”后面。[…]中的字符“/”仍然作为转义符,若要在[…]中包含“/”本身,需要使用“//”。
•  [^…]
     说明:只要字符“^”不是出现在第一个“[”后面,它就是还是字面意义上的“^”。
•   [a-z]
     说明:要在中括号表达式中包括字面意义的连字符(-),可以用反斜杠(/)将它
     标记为原义字符,例如,[a/-z],但此时指的是三个字符了。也可以将连字符(-)放在方括号的开始或结尾处,例如,[-a-z]或[a-z-]。
•   [^a-z]
•    /d
      可以匹配任意一个数字字符。
•    /D
      它可以匹配一个非数字字符。
•    /s   等效于[ /f/n/r/t/v]。
      它可以匹配任何空白字符。
•    /S   等效于[^/f/n/rt/v]。
      它可以匹配任何非空白的字符。
•    /w   等效于[A-Za-z0-9_]。
      它可以匹配任何英文字母和数字类的字符以及下划线。
•    /W   等效于[^A-Za-z0-9_]。
•    .
      它可以匹配除了/n以外的单个任何字符。
      说明:“(.)/1”匹配除了“/n”以外的两个连续的相同的字符。若要匹配
      包括“/n”在内的任意字符,可以使用“[/s/S]”,“[/d/D]”或“[/w/W]”
      等模式。若要匹配“.”字符本身,需要使用“/.”。
     

定位符 
定位符:用于规定匹配模式在目标字符串中的出现位置。
•   ^
     用于匹配目标字符串的开始位置,规定匹配必须发生在目标字符
     串的开始位置上。
     举例说明:“^o”与“ok”中的“o”匹配,但与“hello”中的
     “o”不匹配。如果设置了RegExp对象实例的Multiline属性,
     ^还会与行首匹配,即与“/n”或“/r”之后的位置匹配。
•   $
     用于匹配目标字符串的结尾位置,规定匹配必须发生在目标
     字符串的结尾。这个$ 只能写在表达式的末尾才能发生此作用。
     举例说明:“o$”与“hello”中的“o”匹配,但与“ok”中的
     “o”不匹配。如果设置了RegExp对象实例的Multline属性,
      $还会与行尾匹配,即与“/n”或“/r”之前的位置匹配。
  •  /b
       它可以匹配一个字边界,也就是一个单词的边界。
       它包含了字与空格间的位置以及目标字符串的开始和结束等位置。
       举例说明:“er/b”匹配“never ok”中的“er”,但不匹配“verb”
       中的“er”。
  •  /B
        用来匹配非字边界的情况。
举例说明:“er/B”匹配“verb”中的“er”,但不匹配“never”中的“er”。

原义字符
     在正则表达式中用到的一些元字符不再表示它原来的字面意义,如果要匹配这些具有特殊意义的元字符的字面意义,必须使用反斜扛(/)将它们转义为原义字符,即将反斜杠字符(/)放在它们前面。

      需要进行转义的字符:
      “$”、“(”,“)”、“*”、“+”、“.”、“[”、“]”、“?”、“/”、“/”、“^”、“{”、“}”、“|”


优先级顺序
     正则表达式从左到右进行计算,并遵循优先级顺序。例如,“*”比字符的优先级高,“ab*”是“b”和“*”组合后、再和前面的“a”组合。“()”比“*”的优先级高,“(ab)*”是“a”和“b”组合后、再和后面“*”组合。字符比“|”的优先级高,“a|bc”是“b”和“c”组合后,再和前面的“a”进行选择组合,是“a”和“b”进行选择组合,再和后面的“c”组合。

 

一些正则表达式范例:
   •   匹配空行: /^/s*$/
   •   匹配HTML标记&#xff1a; /<(/S&#43;)(/s[^>]*)?>[/s/S]*/
   •   匹配email地址&#xff1a; /&#xff3b;a-zA-Z0-9_-&#xff3d;&#43;&#64;[ a-zA-Z0-9_-]&#43;(/.[ a-zA-Z0-9_-]&#43;)&#43;/
   •   匹配两个相同的相邻单词&#xff1a; //b([a-z]&#43;/1/b)/
   •   匹配ip地址&#xff1a;/^(/d{1,2}|1/d/d|2[0-4]/d|25[0-5])(/.(/d{1,2}|1/d/d|2[0-4]/d|25[0-5])){3}$/


推荐阅读
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
  • 本文深入探讨了 hCalendar 微格式在事件与时间、地点相关活动标记中的应用。作为微格式系列文章的第四篇,前文已分别介绍了 rel 属性用于定义链接关系、XFN 微格式增强链接的人际关系描述以及 hCard 微格式对个人和组织信息的描述。本次将重点解析 hCalendar 如何通过结构化数据标记,提高事件信息的可读性和互操作性。 ... [详细]
  • 在Eclipse中提升开发效率,推荐使用Google V8插件以增强Node.js的调试体验。安装方法有两种:一是通过Eclipse Marketplace搜索并安装;二是通过“Help”菜单中的“Install New Software”,在名称栏输入“googleV8”。此插件能够显著改善调试过程中的性能和响应速度,提高开发者的生产力。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • 公司计划部署邮件服务器,考虑到已有域名,决定自行搭建内部邮件服务器。经过综合考量,最终选择在Linux环境中进行搭建,并记录了相关配置和实践过程。本文将详细介绍Postfix的基本设置步骤和实践经验,帮助读者快速掌握邮件服务器的搭建方法。 ... [详细]
  • Git基础操作指南:掌握必备技能
    掌握 Git 基础操作是每个开发者必备的技能。本文详细介绍了 Git 的基本命令和使用方法,包括初始化仓库、配置用户信息、添加文件、提交更改以及查看版本历史等关键步骤。通过这些操作,读者可以快速上手并高效管理代码版本。例如,使用 `git config --global user.name` 和 `git config --global user.email` 来设置全局用户名和邮箱,确保每次提交时都能正确标识提交者信息。 ... [详细]
  • 解决手机浏览器无法加载CSS文件的技术方法与常见问题分析
    针对手机浏览器无法加载CSS文件的问题,本文提出了几种有效的解决方案:首先,确保CSS文件路径正确无误;其次,统一CSS文件和网页的编码格式;最后,检查并修正文件后缀的MIME类型设置,以确保浏览器能够正确识别和解析CSS文件。此外,还探讨了可能导致该问题的其他常见原因,如缓存问题和服务器配置错误等。 ... [详细]
  • 在 Android 开发中,通过合理利用系统通知服务,可以显著提升应用的用户交互体验。针对 Android 8.0 及以上版本,开发者需首先创建并注册通知渠道。本文将详细介绍如何在应用中实现这一功能,包括初始化通知管理器、创建通知渠道以及发送通知的具体步骤,帮助开发者更好地理解和应用这些技术细节。 ... [详细]
  • MVVM架构~mvc,mvp,mvvm大话开篇
    返回目录百度百科的定义:MVP是从经典的模式MVC演变而来,它们的基本思想有相通的地方:ControllerPresenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模 ... [详细]
  • 通过深入挖掘,本文揭示了Google鲜为人知的实用小技巧和隐藏功能。例如,用户可以通过在Google搜索引擎中输入特定的查询语句,如“inurl:ViewerFrame?Mode”或“inurl:MultiCameraFrame?Mode”,来查找在线摄像头监控站点。这些技巧不仅能够提升用户的搜索效率,还能帮助他们发现更多有价值的信息资源。此外,文章还介绍了其他一些实用的Google隐藏功能,如高级搜索操作符和个性化设置选项,为用户提供更加丰富的搜索体验。 ... [详细]
author-avatar
靠谱的留一手_267
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有