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

正则表达式入门(ed模糊匹配)

元字符:b代表着单词的开头或结尾,也就是单词的分界处.如果要精确地查找hi这个单词的话,我们应该使用bhib..是另一个元字符,匹配除了换

元字符:

/b 代表着单词的开头或结尾,也就是单词的分界处.如果要精确地查找hi这个单词的话,我们应该使用/bhi/b.

.是另一个元字符,匹配除了换行符以外的任意字符,*同样是元字符,它指定*前边的内容可以重复任意次以使整个表达式得到匹配。


.*连在一起就意味着任意数量的不包含换行的字符。

/d是一个新的元字符,匹配任意的数字,0/d/d-/d/d/d/d/d/d/d/d也就是中国的电话号码.为了避免那么多烦人的重复,我们也可以这样写这个表达式:0/d{2}-/d{8}。

/s匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等。/w匹配字母或数字或下划线或汉字。

/b/w{6}/b 匹配刚好6个字母/数字的单词。

字符转义:使用/来取消这些字符的特殊意义。因此,你应该使用/.和/*。当然,要查找/本身,你也得用//。

  代码     说明 
   .  匹配除换行符以外的任意字符 
  /w  匹配字母或数字或下划线或汉字 
  /s  匹配任意的空白符 
  /d  匹配数字 
  /b  匹配单词的开始或结束 
  ^   匹配字符串的开始 
  $   匹配字符串的结束

重复:
常用的限定符 
代码/语法  说明 
   *  重复零次或更多次 
   +  重复一次或更多次 
   ?  重复零次或一次 
  {n} 重复n次 
 {n,} 重复n次或更多次 
{n,m} 重复n到m次

要想查找数字,字母或数字,你只需要在中括号里列出它们就行了,像[aeiou]就匹配任何一个元音字母,[.?!]匹配标点符号(.或?或!)

反义:
 常用的反义代码 
 代码/语法   说明 
   /W   匹配任意不是字母,数字,下划线,汉字的字符 
   /S   匹配任意不是空白符的字符 
   /D   匹配任意非数字的字符 
   /B   匹配不是单词开头或结束的位置 
 [^x]   匹配除了x以外的任意字符 
      [^aeiou]   匹配除了aeiou这几个字母以外的任意字符


替换:
   正则表达式里的替换指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。
   0/d{2}-/d{8}|0/d{3}-/d{7}这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。
   /(0/d{2}/)[- ]?/d{8}|0/d{2}[- ]?/d{8}这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔。你 可以试试用替换|把这个表达式扩展成也支持4位区号的。
   /d{5}-/d{4}|/d{5}这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字,或者用连字号间隔的9位数字。之所以要给出这个例子是 因为它能说明一个问题:使用替换时,顺序是很重要的。如果你把它改成/d{5}|/d{5}-/d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的 前5位)。原因是匹配替换时,将会从左到右地测试每个分枝条件,如果满足了某个分枝的话,就不会去管其它的替换条件了。

分组:

如果想要重复一个字符串又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了。
     (/d{1,3}/.){3}/d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:/d{1,3}匹配1到3位的数 字,(/d{1,3}/.}{3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(/d{1,3})。 不幸的是,它也将匹配256.300.888.999这种不可能存在的IP地址(IP地址中每个数字都不能大于255)。如果能使用算术比较的话,或许能 简单地解决这个问题,但是正则表达式中并不提供关于数学的任何功能,所以只能使用冗长的分组,选择,字符类来描述一个正确的IP地址: ((2[0-4]/d|25[0-5]|[01]?/d/d?)/.){3}(2[0-4]/d|25[0-5]|[01]?/d/d?)。

后向引用:

后向引用用于重复搜索前面某个分组匹配的文本。例如,/1代表分组1匹配的文本。难以理解?请看示例:
/b(/w+)/b/s+/1/b可以用来匹配重复的单词,像go go, kitty kitty。首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字(/b(/w+)/b),然后是1个或几个空白符(/s+,最后是前面匹配的那个单词(/1)。

懒惰限定符 
*? 重复任意次,但尽可能少重复 
+? 重复1次或更多次,但尽可能少重复 
?? 重复0次或1次,但尽可能少重复 
{n,m}? 重复n到m次,但尽可能少重复 
{n,}? 重复n次以上,但尽可能少重复

位置指定:


接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们用于指定一个位置,就像/b,^,$那样,因此它们也被称为零宽断言。最好还是拿例子来说明吧:

(?=exp)也叫零宽先行断言,它匹配文本中的某些位置,这些位置的后面能匹配给定的后缀exp。比如/b/w+(?=ing/b),匹配以 ing结尾的单词的前面部分(除了ing以外的部分),如果在查找I'm singing while you're dancing.时,它会匹配sing和danc。

(?<&#61;exp)也叫零宽后行断言&#xff0c;它匹配文本中的某些位置&#xff0c;这些位置的前面能给定的前缀匹配exp。比如(?<&#61;/bre)/w&#43;/b会匹配以re开头的单词的后半部分(除了re以外的部分)&#xff0c;例如在查找reading a book时&#xff0c;它匹配ading。

假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了)&#xff0c;你可以这样查找需要在前面和里面添加逗号的部分&#xff1a;((?<&#61;/d)/d{3})*/b。请仔细分析这个表达式&#xff0c;它可能不像你第一眼看出来的那么简单。

下面这个例子同时使用了前缀和后缀&#xff1a;(?<&#61;/s)/d&#43;(?&#61;/s)匹配以空白符间隔的数字(再次强调&#xff0c;不包括这些空白符)。

负向位置指定:


前面我们提到过怎么查找不是某个字符或不在某个字符类里的字符的方法(反义)。但是如果我们只是想要确保某个字符没有出现&#xff0c;但并不想去匹配它时怎么办&#xff1f;例如&#xff0c;如果我们想查找这样的单词--它里面出现了字母q,但是q后面跟的不是字母u,我们可以尝试这样&#xff1a;

/b/w*q[^u]/w*/b匹配包含后面不是字母u的字母q的单词。但是如果多做测试(或者你思维足够敏锐&#xff0c;直接就观察出来了)&#xff0c;你会发现&#xff0c;如 果q出现在单词的结尾的话&#xff0c;像Iraq,Benq&#xff0c;这个表达式就会出错。这是因为[^u]总是匹配一个字符&#xff0c;所以如果q是单词的最后一个字符的话&#xff0c;后面的 [^u]将会匹配q后面的单词分隔符(可能是空格&#xff0c;或者是句号或其它的什么)&#xff0c;后面的/w&#43;/b将会匹配下一个单词&#xff0c;于是/b/w*q[^u]/w*/b 就能匹配整个Iraq fighting。负向位置指定能解决这样的问题&#xff0c;因为它只匹配一个位置&#xff0c;并不消费任何字符。现在&#xff0c;我们可以这样来解决这个问题&#xff1a;/b/w*q(?!u) /w*/b。

零宽负向先行断言(?!exp)&#xff0c;只会匹配后缀exp不存在的位置。/d{3}(?!/d)匹配三位数字&#xff0c;而且这三位数字的后面不能是数字。

同理&#xff0c;我们可以用(?

一个更复杂的例子&#xff1a;(?<&#61;<(/w&#43;)>).*(?&#61;)匹配不包含属性的简单HTML标签内里的内 容。()指定了这样的前缀&#xff1a;被尖括号括起来的单词(比如可能是)&#xff0c;然后是.*(任意的字符串),最后是一 个后缀(?&#61;)。注意后缀里的//&#xff0c;它用到了前面提过的字符转义&#xff1b;/1则是一个反向引用&#xff0c;引用的正是捕获的第一组&#xff0c;前面的 (/w&#43;)匹配的内容&#xff0c;这样如果前缀实际上是的话&#xff0c;后缀就是了。整个表达式匹配的是之间的内容(再次提醒&#xff0c;不包括前缀和后缀本身)。

注释:
小括号的另一种用途是能过语法(?#comment)来包含注释。例如&#xff1a;2[0-4]/d(?#200-249)|25[0-5](?#250-255)|[01]?/d/d?(?#0-199)。

要包含注释的话&#xff0c;最好是启用“忽略模式里的空白符”选项&#xff0c;这样在编写表达式时能任意的添加空格&#xff0c;Tab&#xff0c;换行&#xff0c;而实际使用时这些都将被忽略。启用这个选项后&#xff0c;在#后面到这一行结束的所有文本都将被当成注释忽略掉。

例如&#xff0c;我们可以前面的一个表达式写成这样&#xff1a;

      (?<&#61;    # 查找前缀&#xff0c;但不包含它
      <(/w&#43;)> # 查找尖括号括起来的字母或数字(标签)
      )       # 前缀结束
      .*      # 匹配任意文本
      (?&#61;     # 查找后缀&#xff0c;但不包含它
        # 查找尖括号括起来的内容&#xff1a;前面是一个"/"&#xff0c;后面是先前捕获的标签
      )       # 后缀结束


贪婪与懒惰:
当正则表达式中包含能接受重复的限定符(指定数量的代码&#xff0c;例如*,{5,12}等)时&#xff0c;通常的行为是&#xff08;在使整个表达式能得到匹配的前提下&#xff09;匹配尽可能多的 字符。考虑这个表达式&#xff1a;a.*b&#xff0c;它将会匹配最长的以a开始&#xff0c;以b结束的字符串。如果用它来搜索aabab的话&#xff0c;它会匹配整个字符串aabab。这被称为 贪婪匹配。

有时&#xff0c;我们更需要懒惰匹配&#xff0c;也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式&#xff0c;只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复&#xff0c;但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧&#xff1a;

a.*?b匹配最短的&#xff0c;以a开始&#xff0c;以b结束的字符串。如果把它应用于aabab的话&#xff0c;它会匹配aab和ab&#xff08;为什么第一个匹配是aab而不是ab&#xff1f;简单地说&#xff0c;最先开始的区配最有最大的优先权——The Match That Begins Earliest Wins&#xff09;。

表5.懒惰限定符 *? 重复任意次&#xff0c;但尽可能少重复 
&#43;? 重复1次或更多次&#xff0c;但尽可能少重复 
?? 重复0次或1次&#xff0c;但尽可能少重复 
{n,m}? 重复n到m次&#xff0c;但尽可能少重复 
{n,}? 重复n次以上&#xff0c;但尽可能少重复 

-------------------------------------------------------

下面是一些常用的正则表达式:

匹配中文字符的正则表达式&#xff1a; [/u4e00-/u9fa5]
评注&#xff1a;匹配中文还真是个头疼的事&#xff0c;有了这个表达式就好办了

匹配双字节字符(包括汉字在内)&#xff1a;[^/x00-/xff]
评注&#xff1a;可以用来计算字符串的长度&#xff08;一个双字节字符长度计2&#xff0c;ASCII字符计1&#xff09;

匹配空白行的正则表达式&#xff1a;/n/s*/r
评注&#xff1a;可以用来删除空白行

匹配HTML标记的正则表达式&#xff1a;<(/S*?)[^>]*>.*?|<.*? />
评注&#xff1a;网上流传的版本太糟糕&#xff0c;上面这个也仅仅能匹配部分&#xff0c;对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式&#xff1a;^/s*|/s*$
评注&#xff1a;可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等)&#xff0c;非常有用的表达式

匹配Email地址的正则表达式&#xff1a;/w&#43;([-&#43;.]/w&#43;)*&#64;/w&#43;([-.]/w&#43;)*/./w&#43;([-.]/w&#43;)*
评注&#xff1a;表单验证时很实用

匹配网址URL的正则表达式&#xff1a;[a-zA-z]&#43;://[^/s]*
评注&#xff1a;网上流传的版本功能很有限&#xff0c;上面这个基本可以满足需求

匹配帐号是否合法(字母开头&#xff0c;允许5-16字节&#xff0c;允许字母数字下划线)&#xff1a;^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注&#xff1a;表单验证时很实用

匹配国内电话号码&#xff1a;/d{3}-/d{8}|/d{4}-/d{7}
评注&#xff1a;匹配形式如 0511-4405222 或 021-87888822

匹配腾讯QQ号&#xff1a;[1-9][0-9]{4,}
评注&#xff1a;腾讯QQ号从10000开始

匹配中国邮政编码&#xff1a;[1-9]/d{5}(?!/d)
评注&#xff1a;中国邮政编码为6位数字

匹配身份证&#xff1a;/d{15}|/d{18}
评注&#xff1a;中国的身份证为15位或18位

匹配ip地址&#xff1a;/d&#43;/./d&#43;/./d&#43;/./d&#43;
评注&#xff1a;提取ip地址时有用

匹配特定数字&#xff1a;
^[1-9]/d*$    //匹配正整数
^-[1-9]/d*$   //匹配负整数
^-?[1-9]/d*$   //匹配整数
^[1-9]/d*|0$  //匹配非负整数&#xff08;正整数 &#43; 0&#xff09;
^-[1-9]/d*|0$   //匹配非正整数&#xff08;负整数 &#43; 0&#xff09;
^[1-9]/d*/./d*|0/./d*[1-9]/d*$   //匹配正浮点数
^-([1-9]/d*/./d*|0/./d*[1-9]/d*)$  //匹配负浮点数
^-?([1-9]/d*/./d*|0/./d*[1-9]/d*|0?/.0&#43;|0)$  //匹配浮点数
^[1-9]/d*/./d*|0/./d*[1-9]/d*|0?/.0&#43;|0$   //匹配非负浮点数&#xff08;正浮点数 &#43; 0&#xff09;
^(-([1-9]/d*/./d*|0/./d*[1-9]/d*))|0?/.0&#43;|0$  //匹配非正浮点数&#xff08;负浮点数 &#43; 0&#xff09;
评注&#xff1a;处理大量数据时有用&#xff0c;具体应用时注意修正

匹配特定字符串&#xff1a;
^[A-Za-z]&#43;$  //匹配由26个英文字母组成的字符串
^[A-Z]&#43;$  //匹配由26个英文字母的大写组成的字符串
^[a-z]&#43;$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]&#43;$  //匹配由数字和26个英文字母组成的字符串
^/w&#43;$  //匹配由数字、26个英文字母或者下划线组成的字符串
评注&#xff1a;最基本也是最常用的一些表达式

18311   xencons&#61;12wS0 on 3/29/2007     4 - Minor Error save_state missing

g/^18311/&#43;0,s/xencons&#61;[:a-z:]*[:A-Z:]*[:0-9:]*/xencons&#61;ttyS/g
.
18311   xencons&#61;ttyS on 3/29/2007     4 - Minor Error save_state missing long image listing: pan -il


18311   xencons&#61;ttyS on 3/29/2007     4 - Minor Error save_state missing long image listing: pan -il
g/^18311/&#43;0,s/xencons&#61;[:a-z:|:0-9:|:A-Z:]/xencons&#61;ttyS9/g
.
18311   xencons&#61;ttyS9tyS on 3/29/2007     4 - Minor Error save_state missing long image listing: pan -il
g/^18311/&#43;0,s/xencons&#61;[:a-z:|:0-9:|:A-Z:]*/xencons&#61;ttyS9/g
.
18311   xencons&#61;ttyS9 on 3/29/2007     4 - Minor Error save_state missing long image listing: pan -il

 

转:https://www.cnblogs.com/qq76211822/p/4712086.html



推荐阅读
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 本文介绍了几种常用的图像相似度对比方法,包括直方图方法、图像模板匹配、PSNR峰值信噪比、SSIM结构相似性和感知哈希算法。每种方法都有其优缺点,适用于不同的应用场景。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 体积小巧的vsftpd与pureftpd Docker镜像在Unraid系统中的详细配置指南:支持TLS加密及IPv6协议
    本文详细介绍了如何在Unraid系统中配置体积小巧的vsftpd和Pure-FTPd Docker镜像,以支持TLS加密和IPv6协议。通过这些配置,用户可以实现安全、高效的文件传输服务,适用于各种网络环境。配置过程包括镜像的选择、环境变量的设置以及必要的安全措施,确保了系统的稳定性和数据的安全性。 ... [详细]
  • 在Ubuntu系统中安装Android SDK的详细步骤及解决“Failed to fetch URL https://dlssl.google.com/”错误的方法
    在Ubuntu 11.10 x64系统中安装Android SDK的详细步骤,包括配置环境变量和解决“Failed to fetch URL https://dlssl.google.com/”错误的方法。本文详细介绍了如何在该系统上顺利安装并配置Android SDK,确保开发环境的稳定性和高效性。此外,还提供了解决网络连接问题的实用技巧,帮助用户克服常见的安装障碍。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 本文回顾了作者初次接触Unicode编码时的经历,并详细探讨了ASCII、ANSI、GB2312、UNICODE以及UTF-8和UTF-16编码的区别和应用场景。通过实例分析,帮助读者更好地理解和使用这些编码。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • Visual Studio Code (VSCode) 是一款功能强大的源代码编辑器,支持多种编程语言,具备丰富的扩展生态。本文将详细介绍如何在 macOS 上安装、配置并使用 VSCode。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 微信公众号推送模板40036问题
    返回码错误码描述说明40001invalidcredential不合法的调用凭证40002invalidgrant_type不合法的grant_type40003invalidop ... [详细]
  • 本章介绍了TCP/IP协议族中的链路层,其主要功能是为IP模块发送和接收IP数据报。链路层还支持一些辅助性协议,如ARP。此外,本文详细探讨了不同类型的链路层技术及其应用。 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 本文深入解析了JDK 8中HashMap的源代码,重点探讨了put方法的工作机制及其内部参数的设定原理。HashMap允许键和值为null,但键为null的情况只能出现一次,因为null键在内部通过索引0进行存储。文章详细分析了capacity(容量)、size(大小)、loadFactor(加载因子)以及红黑树转换阈值的设定原则,帮助读者更好地理解HashMap的高效实现和性能优化策略。 ... [详细]
  • 计算机视觉领域介绍 | 自然语言驱动的跨模态行人重识别前沿技术综述(上篇)
    本文介绍了计算机视觉领域的最新进展,特别是自然语言驱动的跨模态行人重识别技术。上篇内容详细探讨了该领域的基础理论、关键技术及当前的研究热点,为读者提供了全面的概述。 ... [详细]
author-avatar
雨润风华_684
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有