热门标签 | 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



推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
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社区 版权所有