正则表达式 Regular Expression
为什么要使用正则表达式
正则表达式是一种可以用于模式匹配和替换的强有力的工具。
作用:
- 测试字符串的某个模式,即数据有效性验证
- 实现按照某种规则替换文本
- 根据模式匹配从字符串中提取一个子字符串
正则历史
- 沃伦和沃尔特这两位神经生理学家研究出一种用来描述神经网络的数学方式。
- 1956 年美国数学家斯蒂芬在沃尔特和沃伦早期工作的基础上,发表了一篇标题为:《神经网络事件的表示法》的论文,引入了正则表达式的概念。
- 正则表达式就是用来描述被称为“正则集代数”的表达式,因此采用“正则表达式”这个术语。
正则表达式的构成
正则表达式一般由两个部分组成。一部分是在双斜杠内部的字符串,称为匹配模式,用来表示要匹配的字符串的特征;另一部分是在第二个斜杠的后面,是一个字母,叫做正则表达式的标志位,由三个字母组合而成,具体请参见标志字符。
匹配模式由两部分组成,分别为:普通字符(例如字符a到z)和特殊字符(称为元字符)。正则表达式描述在查找字符串时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
正则表达式的定义方法有两种,一种是上例中的方法,使用双斜杠来定义,语法格式如下所示:
var 正则表达式=/匹配模式/标志位
例:var a= /abc/g;
var b=new RegExp("abc","g");
正则表达式组成
正则表达式由一些普通字符和一些元字符组成。
普通字符:包括大小写的字母和数字;
元字符:可以匹配某些字符形式的具有特殊含义的字符。元字符从功能上大致分为:限定符、定位符。
把希望查找匹配对象的模式内容放入“/”定界符之间即可。
元字符—定位符
定位符:定位符用于规定匹配模式在目标字符串中的出现位置。
元字符—限定符
限定符:可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
默认情况下,正则表达式使用最长(也叫贪婪)匹配原则。当字符“?”紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式变成使用最短(也叫非贪婪)匹配原则。
例如,在字符串“fooood”中,“fo+?”只匹配“fo”部分,而“fo+”匹配“foooo”部分。
正则表达式—范围指定符
常见元字符
优先级顺序
正则表达式在匹配过程中是按照从左向右的顺序进行的,其操作符具有一定的优先级顺序。
JS中正则表达式的使用
1.创建正则表达式对象
JavaScript中提供一个名为RegExp的对象来完成有关正则表达式的操作和功能,每一条正则表达式模式对应一个RegExp对象实例。
在JavaScript中,有两种方式可以创建RegExp对象的实例:
(1)var reg = new RegExp(“pattern”[,“flags”])
(2)var reg = /pattern/[flags]
pattern部分为要使用的正则表达式模式文本,是必须的。在第一种方式中,pattern部分以JavaScript字符串的形式存在,需要使用双引号或单引号引起来;在第二种方式中,pattern部分嵌套在两个“/”字符之间,不能使用引号引起来。
flags部分设置正则表达式模式的标志信息,是可选的,可以是以下标志字符的组合:
g:代表可以进行全局匹配。
i:代表不区分大小写匹配。
m:代表可以进行多行匹配。
String类的方法应用
例
var a= /abc/g;
var b="an abc kang";
alert(b.match(a));
输出:abc
例
var a= /abc/g;
var b="an abc kang abc";
alert(b.match(a));
输出:abc,abc
正则表达式有三种字符:普通字符、元字符、元序列(不可见字符)
例:普通字符
var a= /abc=/g;
var b="an abc= kang abc";
alert(b.match(a));
输出:abc=
元字符:就是11个具有特殊作用的字符
^ $ \ . * + ? () [] {} |
这些元字符要用反斜杠进行转义
例:元字符
var a= /a\+bc=/g;
var b="an a+bc= kang abc";
alert(b.match(a));
输出:a+bc=
元序列(不可见字符)和元字符类似,在正则表达式中具有特殊含义,元序列由多个字符组成。
不可见字符:回车键、换行等
例:不可见字符
var a= /\r/g;
var b="an \r abc \r kang \r abc";
alert(b.match(a));
输出:
常用的正则表达式
例:查找含abc或adc的字符串
var a= /a[bd]c/g;
var b="abc adc afc";
alert(b.match(a));
输出:abc,adc
例:查找从acc到agc的字符串
var a= /a[c-g]c/g;
var b="abc adc afc";
alert(b.match(a));
输出:adc,afc
例:查找不含abc或adc的字符串
var a= /a[^bd]c/g;
var b="abc adc afc";
alert(b.match(a));
输出:afc
注意: ^ 要紧跟[出现,如果[b^d],它就只是一个普通字符了
例:查找的字符串中由这些字符,需要也可以加上转义符号:] \ ^ -
var a= /a[b \^ d]c/g; //var a= /a[b^d]c/g;结果一致
var b="abc adc afc a^c";
alert(b.match(a));
输出:abc,adc,a^c
点号的使用
匹配任意单个字符
例:匹配输出全部字符串,但是不能匹配/n
var a= /a.c/g;
var b="abc adc afc a^c";
alert(b.match(a));
输出:abc,adc,afc,a^c
选择符的使用
例:
var a= /abc|afc/g;
var b="abc adc afc a^c";
alert(b.match(a));
输出:abc,afc
同时检测多个正则式子在字符串中的匹配
分组符的使用
例:
var a= /a(b|f)c/g;
var b="abc adc afc a^c";
alert(b.match(a));
输出:abc,afc
字符串中有重复
{}描述重复次数
a{3}b等价aaab :检索时,aaaab是否能检索到a{3}b
a{2,}b意思为,a至少重复2次
a{2,4}b意思为,检索a重复2到4次之间的
例:字符串的有重复的检索
var a= /a{2,4}b/g;
var b="a ab aab aaab aaaab aaaaab";
alert(b.match(a));
输出:aab,aaab,aaaab,aaaab
限定符、+、?*
ab* 匹配前面重复零次或多次的项目
a ab abb abbb abbbbbbbb
ab+ 匹配前面重复一次或多次的项目
ab abb abbb abbbbbbbb
ab? 匹配前面重复零次或一次的项目
a ab
例:
/a[ec]*d/ 等价 /ae*d/和/ac*d/
/(ab)*d/ 等价 /abd/和/ababd/和/abababd/……组的重复
正则表达式定位问题
由标志位为m选项时,产生的。有2个符号
^ 定位正则表达式匹配的位置为字符串的开头(匹配的换行和回车符之后的字符串)
$ 定位正则表达式匹配的位置为字符串的结尾(匹配的换行和回车符之前的字符串)
由标志位可以不为m选项时,有2个符号
\b 定位正则表达式匹配的位置为单词的边界(单词边界即单词和空格间的位置)
\B 定位正则表达式匹配的位置为非单词的边界(就是除单词边界位置以外的任意位置)
例:\b 匹配单词开头是cb的
var a= /\bcb/g;
var b="aab cb ab";
alert(b.match(a));
alert(b.search(a));
输出:cb 4
例:\B 匹配除过单词边界是cb的,其他cb
var a= /cb\B/g;
var b="aacba cb ab";
alert(b.match(a));
alert(b.search(a));
输出:cb 2
cb是b字符串中前面对应的那一个,而不是后面对应的那一个。
正则在JS中的应用
在字符串中执行查找//校验是否全由数字组成
exec 方法:String[ ] exec(String source)
例如:
function isDigit(s){
var reg = /^[0-9]{1,20}$/;
var result = reg.exec(s);
//如果格式正确,返回原字符串,否则返回null
alert(result);
}
在字符串中执行查找
match 方法:String[] match(String reg)
例如:
function matchDemo(String source){
var reg = /^[a-z]/;
var result = source.match(reg);
alert(result);
}
执行模式判定
test 方法:Boolean test(String source)
例如:
function isDigit(s){
var reg = /^[0-9]{1,20}$/;
var flag = reg.test(s);
//如果格式正确,返回true,否则返回false
if(flag){
return true;
}else{
return false;
}
}
执行字符串位置查询
search 方法:int search(String reg)
例如:
function seachString(){
var r, re; // 声明变量
var s = "The rain in Spain falls mainly in the plain.";
re = /falls/; // 创建正则表达式模式
r = s.search(re); // 查找字符串
alert(r); // 返回 int 结果表示出现位置
}
执行字符串分割
split 方法:String[ ] split(String reg)
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
var r, reg; // 声明变量
reg = /abc/; // 创建正则表达式模式
var s ="IcansaymyabcIcansaymyabcIcan…";
r = s.split(reg); // 分割字符串
for(var p in r){ // 返回 String 数组
alert(r[p]);
}
</script>
</body>
</html>
验证Email地址
function test_email(strEmail) {
var myReg = /^[ _a-z0-9]+@([ _a-z0-9]+\.)+[a-z0-9]{2,3}$/; if(myReg.test(strEmail)){
return true;
}
else{
return false;
}
}
验证电话号码
function isTel(s) {
var patrn=/^(\d{3}-)?\d{8}|(\d{4}-)(\d{7,8})$/;
if (!patrn.test(s))
return false
return true
}
校验手机号码
function isMobil(s) {
var patrn=/^1[3,5]\d{9}$/; if (!patrn.test(s)) return false
return true
}
验证邮政编码
function isPostalCode(s) {
var patrn=/^d{6}$/; if (!patrn.test(s)) return false;
return true;
}
验证日期
function test_email(strDate) {var Reg =
/^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|
(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|
(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))
-0?2-29-))$/ ;
if(Reg.test(strDate)) return true;
return false;
}
常用正则表达式
总结
正则表达式语法简洁,实现简单
正则表达式使得JavaScript的客户端验证更加容易
正则表达式还能够应用在 C# 和 JAVA中,有着非常广阔的应用前景