一篇文章看懂正则表达式
今天小华君要跟大家分享的内容如题,就是正则表达式。一篇文章说实话,想把正则表达式的内容全部说清楚,是不太现实的,一是本身正则表达式要掌握的东西就不少,二是他也同样需要你自己的实际操作练习才能更好地掌握。不过,小华君希望通过这一篇文章让大家对正则表达式有基本的了解,可以在自己的网页制作或者程序制作中使用它。
首先,我们来看一下什么是正则表达式。
正则表达式(Regular Expression,在代码中常简写为regex、regexp或RE)是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。许多程序设计语言都支持利用正则表达式进行字符串操作。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。简单点说,我们在编写处理字符串的程序或网页时,经常会有查符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。一句话概括,正则表达式就是记录文本规则的代码。
用一个草图来看正则表达式的工作原理,大概就是这样:
我们用一个例子来理解。假设你在一篇英文小说里查hi,你使用正则表达式hi,那么它就可以精确匹配这样的字符串:由两个字符组成,前一个字符是h,后一个字符是i。处理正则表达式的工具通常会提供一个忽略大小写的选项,如果选中了这个选项,那么它可以匹配,hi,hI,Hi,HI四中情况中的全部情况。
一般情况下,虽然你只想查hi,但是由于像hit,him,hibit这类词语,因为包含hi,也会被查出来。如果我们想精确地查hi怎么办?这个时候,元字符的功能就体现出来了。元字符\b就可以解决这一类的问题。
\b 匹配单词的开始或结束,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。
假如你要的是hi后边隔了一些字符的的like,那么你应该用你应该用\bhi\b.*\blike\b。
.也是一个元字符,可以匹配除了换行符以外的任意字符。*也是元字符,只不过它代表的是数量,它指定*之前的内容可以连续重读使用任意次以使整个表达式得到匹配。所以,.和*连在一起使用就意味着数量的不包含换行的字符。\bhi\b.*\blike\b意思就是先是单词hi,然后是任意个任意字符,但是不能换行,最后是like这个单词。
除了\b、.和*之外,还有一些常用的元字符。\d匹配数字。\w匹配字母或数字或下划线或汉字。\s匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等。$匹配字符串的结束,^匹配字符串的开始。
如果你想查元字符本身,比如.或者*,这时候就需要使用\来实现字符转义,取消这些字符的特殊意义,也就是说你需要使用\.和\*。即使是查\本身,也需要使用\\。比如baidu\,匹配baidu。
在匹配重复方式上,正则表达式也有限定符。* 重复零次或更多次。+ 重复一次或更多次。? 重复零次或一次。{n} 重复n次。{n,} 重复n次或更多次。{n,m} 重复n到m次。比如一个网站如果要求你填写的QQ号必须为5位到12位数字时,可以使用:^\d{5,12}$。{5,12}表示重复的次数不能少于5次,不能多于12次,否则都不匹配;Windows\d+匹配Windows后面跟1个或更多数字。
由于已经有了对应数字、字母、空白这些字符集合的元字符,所以我们我们想查数字、字母、空白是很简单的,但是如果想匹配没有预定义元字符的字符集合怎么办?很简单,拿元音字母a,e,i,o,u做例子。很简单,只需要在方括号里列出它们就行了,像[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)。也可以轻松地指定一个字符范围,像[0-9]代表的含意与\d就是完全一致的:一位数字。同理[a-z0-9A-Z_]也完全等同于\w(只考虑英文)。
来看一个更复杂的表达式。\(?0\d{2}[) -]?\d{8}。这个表达式可以匹配几种格式的电话号码,像(010)88886666,或************,或***********等。不幸的是,这个表达式也能匹配010)12345678或*************这样的“不正确”的格式。要解决这个问题,我们需要用到分枝条件。正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。比如,0\d{2}-\d{8}|0\d{3}-\d{7}这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如************),一种是4位区号,7位本地号*************)。要注意的是,使用分枝条件时,要注意各个条件的顺序,因为匹配分枝条件时,将会从左到右测试每一个条件,如果满足了某一
个分枝,其他条件就会被忽略。
在字符后边加上限定符可以重复单个字符,如果想重复多个字符可以通过小括号来指定子表达式,也叫作分组,这样就可以指定这个子表达式的重复次数。(\d{1,3}\.){3}\d{1,3}是一个简单的IP地址匹配表达式。\d{1,3}匹配1到3位的数字,(\d{1,3}\.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。
以上,小华君主要是跟大家讲了元字符、字符转义、重复、字符类和分枝条件、分组,关于正则表达式的反义、零宽断言、贪婪与懒惰、处理选项这些内容,小华君就简单地说一下吧。
反义
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
懒惰与贪婪
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
零宽断言
正则表达式提取中文字符(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
选项
IgnoreCase(忽略大小写) 匹配时不区分大小写。(javascript: i)
Multiline(多行模式) 更改^和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含意是:匹配\n之前的位置以及字符串结束前的位置.) (javascript: m)
global 全局匹配(javascript: g)
Singleline(单行模式) 更改.的含义,使它与每一个字符匹配(包括换行符\n)。IgnorePatternWhitespace(忽略空白) 忽略表达式中的非转义空白并启用由#标记的注释。ExplicitCapture(显式捕获) 仅捕获已被显式命名的组。
最后,小华君依然欢迎大家评论补充或指正。好了,小华君要接着整理关于北京华信智原Java课程升级的资料的,高校的专家老师团在做了市场调研之后,指导做出了课程体系的升级,结合了最前沿的技术和市场最紧缺的需要,如果你想在四个月内学Java,不妨来这里试听一节课。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。