您的位置:首页 > Web前端 > JavaScript

JavaScript中的正则表达式-正则入门

2015-05-07 10:07 176 查看
正则表达式(Regular Expression)起源于人类神经系统的早期研究。关于正则表达式的定义存在多种说法,大体意思都差不多,具体如下:

1.正则表达式就是用某种模式去匹配一类字符串的公式,主要用来描述字符串匹配的工具。

2.正则表达式是由普通字符(如字符a~z)和特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

3.正则表达式就是记录文本规则的代码。

......

在正则表达式中,匹配是最常用的一个词,它描述了正则表达式的动作结果。给定一段文本或字符串,使用正则表达式从文本或字符串中查找出符合正则表达式的字符串。有可能文本或字符串存在不止一个部分满足给定的正则表达式,这时每一个这样的部分都被称为一个匹配。

正则表达式的应用:

1.验证字符串,即验证给定的字符串或子字符串是否符合知道特征。

2.查找字符串,从给定的文本中查找符合指定特征的字符串。

3.替换字符串,即把给定字符串中符合指定特征的子字符串替换为其他字符串。

4.提取字符串,即从给定的字符串中提取符合特征的子字符串。

正则表达式中的重要概念:

1.元字符:Metacharacter,它能够匹配一个位置或字符集合中的一个字符。元字符可以分为两种:

(1)匹配位置的元字符,包括3个字符:^,$,\b。

^:只匹配一个位置,匹配行的开始。例如:以下正则表达式匹配以“String”开始的行。

^String


$:只匹配一个位置,匹配行的结尾。例如:以下正则表达式匹配以“String”结尾的行。

String$
^和$可以组合使用,例如:以下正则表达式匹配一个空行。

^$


\b:也是匹配一个位置,可以匹配单词的开始或结尾,即单词的分界处。例如:要匹配以“Str”开头的字符串,“String”,“String Format”等。

\bStr
以下正则表达式匹配以“ing”结尾的单词,"String"、“learning”等

ing\b
如果要精确匹配一个完整的单词“String”,则可以使用如下正则表达式:

\bString\b


(2)匹配字符的元字符。

.(点号):匹配除换行符外任意字符。

\w:匹配单词字符(包括字母、数字、下划线、汉字)。

\W:匹配任意的非单词字符(包括字母、数字、下划线和汉字)。

\s:匹配任意的空白字符,如空格、制表符、换行符、中文全角空格等。

\S:匹配任意的非空白字符。

\d:匹配任意的数字字符。

\D:匹配任意的非数字字符。

2.字符类

在正则表达式中,元字符通常一次只能匹配一个位置或字符集合中一个字符,但是如果你想匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u),则需要自定义匹配的字符集合,就要用到字符类。字符类就是一个字符集合,如果该字符集合中的任何一个字符被匹配,则它就会找到该匹配项。

字符类在方括号“[]”中定义,最简单的字符类由方括号“[]”和一个字母表构成,比如要匹配之前提到的元音字母,可以用[aeiou]这个字符类。

字符类可以用“-”连接符来定义字符的范围。例如正则表达式[0123456789]等价于[0~9]。

在字符类中,若字符“^”是字符类的第一个字符,则表示否定该字符类,即匹配除了该字符类之外的任意字符。这也就是反义的表达式。例如以下表达式匹配任何非元音字符:

[^aAeEIioOuU]


以下正则式匹配字符a之后不是字符b的字符串。

a[^b]


3.字符转义

正则表达式定义了一些特殊的元字符,比如^、$、.等。由于这些字符在正则表达式中被解释成了其他指定的意义,如果要匹配这些字符,则需使用字符转义来解决这一问题。

转义字符为反斜杠“\”,它的作用就是取消这些特殊字符在表达式中具有的特殊含义。

例如,匹配www.baidu.com的正则表达式为:

www\.baidu\.com


常见的需要转义的字符有:.、$、^、{、[、(、|、)、]、}、*、+、?、\。注意正斜杠“/”不用转义

\n:匹配换行符

\t:匹配一个制表符

\r:匹配一个回车符

\f:匹配一个换页符

\v:匹配一个垂直制表符

[\t\r\n\f\v]等价于\s,,jquery源码中匹配空字符用的正则表达式是:/[\t\r\n\f]/g

4.限定符。

正则表达式的元字符一次一般只能匹配一个字符或位置,如果想要匹配零个、一个或多个字符时,则需要使用限定符。限定符用于指定允许特定字符或字符集自身重复出现的次数。例如:{n}表示重复n次,{n,}表示至少重复n次,{n,m}至少重复n次,至多m次。还有常用的限制符如下:

*——至少重复0次,同{0,}

+——至少重复1次,同{1,}

?——至少重复0次或1次,同{0,1}

注意,这些限制符都放在它们要限制的字符后面。

例如,以下正则表达式可以匹配“color”或“colour”。

colou?r


如果我们在限定符*、+、?、{n}、{n,}、{n,m}之后再添加一个字符“?”,则表示尽可能少地重复字符"?"之前的限定符合的重复次数,这种匹配方式被称为懒惰匹配。之前我们仅使用单个限定符的匹配称为贪婪匹配。

通过下面的例子可以帮助我们更好地理解:

假设我们有一个字符串“aaabaab”,我们是贪婪正则表达式

a.*b
去匹配,这个表达式匹配的是以字母a开头、以字母b结尾的最长字符串,结果只有一个,aaabaab。

如果我们以懒惰正则表达式去匹配

a.*?b
这个表达式匹配以a开头,b结尾的最短字符串,结果有两个,aaab和aab。

换句话说,贪婪匹配就是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符,而懒惰匹配就是匹配尽可能少的字符。

5.替换(也叫分支条件)

最简单的替换用“|”表示,它表示如果某一个字符串匹配了正则表达式中的字符“|”的左边或者右边的规则,那么该字符串也就匹配了该正则表达式。

6.分组

我们已经提到了怎么重复单个字符(直接在字符后面加上限定符就行了);但如果想要重复多个字符又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了。分组时使用“(”,“)”来处理,分组后将括号之间的表达式看成一个整体来处理。

例如我们可以利用如下的正则表达式来匹配简单的IP地址:

(\d{1,3}\.){3}\d{1,3}


但是,这个正则表达式也会匹配一些不存在的ip,例如888.23.888.999。下面是一个改良后的能匹配大多数正确IP的正则表达式

((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)


7.反向引用

使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。

例如,以下表达式匹配具有两个重复字符的单词。

\b(\w)\1\b
它的作用与:”\b\w\w\b“是一样的。反向引用只是提供了查找重复字符组的简便方法。

除了上述这些,正则表达式还有零宽度断言、负向零宽度断言、匹配选项等、优先级顺序、递归匹配等。

具体可以看看这个博客http://www.jb51.net/tools/zhengze.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: