咨询热线 15618230928

上海Web前端培训:正则表达式使用详解(全面)

发布时间:2019-01-06 13:41:13

正则表达式使用详解(全面)

正则表达式使用详解(全面)

前言:正规表达式是网站前端开发的一个很重要的技术,本文整编了网上摘下的一些文章,对正规表达式的语法和应用作了一个全面的讲解,以使大家参考!
一、简介
简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。其作用如下:
1、测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。
2、替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。
3、根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。
二、基本语法
1、正则表达式的形式
一般为:/love/[flags]
其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。
2、元字符
为了能够使用户更加灵活的定制模式内容,正则表达式提供了专门的“元字符”。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。较为常用的元字符有:
“+”:规定其前导字符必须在目标对象中连续出现一次或多次。
“*”:规定其前导字符必须在目标对象中出现零次或连续多次。
“?”:规定其前导对象必须在目标对象中连续出现零次或一次。
示例如下:
/fo+/ :因为表达式中包含“+”元字符,表示可以与目标对象中的 “fool”, “fo”, 或者 “football”等在字母f后面连续出现一个或多个字母o的字符串相匹配。
/eg*/ :因为表达式中包含“*”元字符,表示可以与目标对象中的 “easy”, “ego”, 或者 “egg”等在字母e后面连续出现零个或多个字母g的字符串相匹配。
/Wil?/ :因为表达式中包含“?”元字符,表示可以与目标对象中的 “Win”, 或者“Wilson”,等在字母i后面连续出现零个或一个字母l的字符串相匹配。
3、次数限定词
正则表达式支持次数限定符的概念,这些限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
{n}:匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个o。
{n,}:至少匹配 n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m}:m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
4、其它重要元字符
在对如何使用正则表达式有了初步了解之后,我们来看一下其它几个重要的元字符的使用方式。
s:用于匹配单个空格符,包括tab键和换行符;
S:用于匹配除单个空格符之外的所有字符;与s互为逆运算。
d:用于匹配从0到9的数字;
w:用于匹配字母,数字或下划线字符;
W:用于匹配所有与w不匹配的字符;与w互为逆运算。
. :用于匹配除换行符之外的所有字符。
示例如下:
/s+/   :上述正则表达式可以用于匹配目标对象中的一个或多个空格字符。
/d000/ :如果我们手中有一份复杂的财务报表,那么我们可以通过这个正则表达式查找到所有总额达千元的款项。
5、定位符
除了我们以上所介绍的元字符之外,正则表达式中还具有另外一种较为独特的专用字符,即定位符。定位符用于规定匹配模式在目标对象中的出现位置。 较为常用的定位符包括:
“^”:规定匹配模式必须出现在目标字符串的开头
“$”:规定匹配模式必须出现在目标对象的结尾,与“^”互为逆运算。
“b”:规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一
“B”:规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾。与“b ”互为逆运算。
示例如下:
/^hell/  :可以与目标对象中以 “hell”, “hello”或“hellhound”开头的字符串相匹配。
/ar$/  :可以与目标对象中以 “car”, “bar”或 “ar” 结尾的字符串相匹配。
/bbom/ :因为正则表达式模式以“b”定位符开头,所以可以与目标对象中以 “bomb”, 或 “bom”开头的字符串相匹配。
/manb/  :因为正则表达式模式以“b”定位符结尾,所以可以与目标对象中以 “human”, “woman”或 “man”结尾的字符串相匹配。
6、其它重要限定符
1)范围限定符“[ ]”:为了能够方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。例如:
/[A-Z]/ 表达式将会与从A到Z范围内任何一个大写字母相匹配。
/[a-z]/ 表达式将会与从a到z范围内任何一个小写字母相匹配。
/[0-9]/  达式将会与从0到9范围内任何一个数字相匹配。
/([a-z][A-Z][0-9])+/ 表达式将会与任何由字母和数字组成的字符串,如 “aB0” 等相匹配。
2)组合限定符“()”:用于把字符串组合在一起,“()”符号包含的内容必须同时出现在目标对象中。
3)管道符 “|”:如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符 “|”。例如:/to|too|2/ 上述正则表达式将会与目标对象中的 “to”, “too”, 或 “2” 相匹配。
4)否定符 “[^]”:正则表达式中还有一个较为常用的运算符,即否定符 “[^]”。与前文所介绍的定位符“^”不同,否定符 “[^]”规定目标对象中不能存在模式中所规定的字符串。例如:/[^A-C]/上述字符串将会与目标对象中除A,B,和C之外的任何字符相匹配。一般来说,当“^”出现在 “[]”内时就被视做否定运算符;而当“^”位于“[]”之外,或没有“[]”时,则应当被视做定位符。
5)转义符“”:当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义符“”。例如:/Th*/上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。
7、flags
为可选项,标志模式匹配时的查询方式,标志符可以组合使用,可用标志符有:
g: 全文查找出现的所有pattern
i :忽略大小写
m:多行查找
三、优先级
在构造正则表达式之后,就可以象数学表达式一样来求值,也就是说,可以从左至右并按照一个优先级顺序来求值。优先级如下:
1. 转义符
2.(), (?:), (?=), [] 圆括号和方括号
3.*, +, ?, {n}, {n,}, {n,m} 限定符
4.^, $, anymetacharacter 位置和顺序
5.|“或”操作
实例:
例1 测试电话号码合法性
var regPhone=/^0d{2,3}-d{7,8}$/;
alert(regPhone.test("021-123478"));
例2 测试e-mail合法性
var regPhone=/^(w+.?)*w+@w+.w+$/;
alert("email"+regPhone.test(abc.xyz@snetway.com));
例3 使用字串“**”替代字串“iaxbloayBveA3bu!”所有以a开头b结束且只有三个字符的子串,忽略大小写。
var reg=/awb/gi;
var s="iaxbloayBveA3bu!";
alert(s.replace(reg,""));
(本题如用空串来替代结果如何?)
四、正则表达式对象
本对象包含正则表达式模式以及表明如何应用模式的标志。
1、语法
语法 1 re = /pattern/[flags]
语法 2 re = new RegExp("pattern",["flags"])
2、参数
re:必选项。将要赋值为正则表达式模式的变量名。
pattern:必选项。要使用的正则表达式模式。如果使用语法 1,用 "/" 字符分隔模式。如果用语法 2,用引号将模式引起来。
flags:可选项,意义同前。
3、应用示例
function MatchDemo()
{
var r, re; // 声明变量。
var s = "The rain in Spain falls mainly in the plain";
re = new RegExp("ain","g"); // 创建正则表达式对象。
r = s.match(re); // 在字符串 s 中查找匹配。
return(r);
}
五、常见用法
正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。
1、匹配常用数据
1)中文字符: [u4e00-u9fa5]
2)双字节字符(包括汉字在内):[^x00-xff]
3)HTML标记:<(S*?)[^>]*>.*?|<.*? />
4)首尾空白字符的正则表达式:^s*|s*$
5)Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
6)网址URL的正则表达式:[a-zA-z]+://[^s]*
7)国内电话号码:d{3}-d{8}|d{4}-d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
8)腾讯QQ号:[1-9][0-9]{4,}(腾讯QQ号从10000开始)
9)中国邮政编码:[1-9]d{5}(?!d)
10)身份证:d{15}|d{18}
11)ip地址:d+.d+.d+.d+
2、匹配特定数值
1)非负整数:^[1-9]d*|0$
2)正浮点数:^[1-9]d*.d*|0.d*[1-9]d*$
3)浮点数:^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$