正则表达式

Posted yhrfighting123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式相关的知识,希望对你有一定的参考价值。

正则表达式:正则表达式是一种对字符串操作的逻辑表达式,用来对字符串进行筛选和匹配

构成:正则表达式由元字符和普通字符构成,普通字符包含字母,数字,特殊符号,遇到普通字符直接写就可以匹配了,遇到转义字符需要\\去转义

        重点在元字符,元字符才是正则表达式的灵魂

优缺点:

  优点:灵活,功能性强,逻辑性强

  缺点:难理解,不易上手

我们一般可以用这个网站进行正则表达式的测试:http://tool.chinaz.com/regex/

下面来介绍正则表达式的灵魂----元字符

我只给出一些常用的元字符:
  1.字符组

  用[]括起来的字符串叫做字符组,[]内的字符会被匹配到

  eg:正则表达式是[abc],那么字符串中的a,b,c都会被匹配到

  技术图片

  如果字符组里的内容过多,还可以用-表示范围的意思,eg:[a-z]就是匹配a到z之间的所有小写字母(包括a,z)    [A-Za-z]匹配的是A-Z与a-z之间的所有字母(包括两端)

  ps:为什么是A-Z写前面呢? 字符组里的内容的顺序是按照ascii码的顺序,在ascii码表里A-Z排在a-z的前边,所以他就排前边喽,顺序千万不能反,否则匹配不出来

  2.简单元字符(常用)

    . 匹配除换行符以外的任意字符

    w 匹配字母或数字或下划线

    s 匹配任意空白符

    d 匹配数字

     匹配一个换行符

     匹配一个制表符

     匹配一个单词的结尾,前边要写结尾的字母

    ^ 匹配字符串的开头,后边要写开头的字符串

    $ 匹配字符串的结尾,前边要写结尾的字符串

    W 匹配非字母或数字或下划线

    D 匹配非数字

    S 匹配非空白符

    a|b 匹配字符串a或字符串b

    () 匹配括号内的表达式,   ps:()的优先级高,匹配时先看()中的内容

    [] 字符组(上边已经说过了)

    [^] 匹配除了字符串中的字符的所有其他字符

  3.量词

    使用量词可以一次性的匹配到很多个字符

    * 重复0次或更多次

    + 重复一次或更多次

    ? 重复零次或一次

    {n} 重复n次

    {n,} 重复n次或更多次

    {n,m} 重复n-m次

  4.惰性匹配和贪婪匹配

    惰性和贪婪顾名思义,一个表示尽可能的少,一个表示尽可能的多

    量词中的 * + {}  都属于贪婪匹配,就是在满足匹配时,尽可能长的匹配字符串

    ?则属于惰性匹配,就是在满足匹配时,尽可能少的匹配字符串

 

理论的东西差不多说完了,我们实践一下

技术图片

我们看下这个,正则表达式是小明.*,首先只要是小明就能匹配到,然后.,就是除了换行符都能匹配到,然后*就是贪婪匹配,尽可能的多的匹配

如果加一个?呢,应该匹配小明吧,因为?属于惰性匹配,匹配的小明之后,尽可能少的匹配,也就是不匹配字符了,我们来验证一下

技术图片 

与我们的猜想符合,继续往下看

技术图片

简单分析一下,首先以<开头才能进行匹配,然后.*表示只要是换行符我都能匹配到,然后还得是>结尾,字符串满足这些规则,很自然就匹配上了

下边着重说一下贪婪匹配和惰性匹配

技术图片  技术图片

第一张图片是惰性匹配,第二章图片是贪婪匹配,我们可以很清楚的看到差别,

在第一张图中,惰性这个词体现的淋漓尽致,因为有.所以他要匹配除了换行符之外的字符,然后又一a为结尾,所以我尽可能的少匹配,只要匹配a前边一个字符就好了,一匹配a就返回匹配结果

在第二种图中,贪婪这个词也体现的淋漓尽致,首先还是先匹配除换行符以外的其他字符,然后以a为结尾,但是碰到第一个a我不管,继续往下匹配,知道碰到最后一个a,我才返回匹配结果,尽可能的是匹配到的字符串长

 

下边我给出几个常用的正则表达式(摘自http://tool.chinaz.com/regex/),我们可以自己解读一下,当然如果有能力的话,自己写正则也不错

E-mail地址:w[-w.+]*@([A-Za-z0-9][-A-Za-z0-9]+.)+[A-Za-z]{2,14}

身份证号:d{17}[d|x]|d{15}

手机号(国内):0?(13|14|15|17|18|19)[0-9]{9}

邮政编码:d{6}

IP地址:(25[0-5]|2[0-4]d|[0-1]d{2}|[1-9]?d).(25[0-5]|2[0-4]d|[0-1]d{2}|[1-9]?d).(25[0-5]|2[0-4]d|[0-1]d{2}|[1-9]?d).(25[0-5]|2[0-4]d|[0-1]d{2}|[1-9]?d)

格式日期:d{4}(-|/|.)d{1,2}1d{1,2}

还有很多,我就不写了,可以自行浏览

 

 

以上是关于正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

PHP 正则表达式总结

正则表达式

正则表达式

正则表达式“或“的使用

正则表达式 验证数字格式 非负数 小数点后保留两位 数字正则 double正则

JS正则表达式详解