■ 什么是 正则表达式 ?
正则表达式不属于某个编程语言,正则表达式是一门独立的知识。它在所有编程语言中都通用。
正则表达式可理解为“规律表达式”,找到你想要的字符串的规律 并表述出来,就是正则表达式。
★ 正则表达式 的作用:描述字符串的规律。
★ 创建正则表达式的口诀:
从哪里开始找?(定位符、元字符:\b \B)
找什么?(字符)
找几个?(限定符)
■ 在 JavaScript 中使用正则表达式:
例如:
var myReg = /\d{4}/gi;
var myReg = /[a-z]+[0-9]+/;
var myReg = /([a-z]+[0-9]+)+/; //★ 小括号 ( ) 用于定义子表达式
■ JS 中创建正则表达式的一般形式:
①var regExp = /正则表达式内容/gi; //隐式创建
②var regExp = new RegExp(正则表达式内容,"gi"); //显示创建
修饰符:
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配(把字符串的每一行都看作一条独立的字符串)。
s 单行模式,即 无视字符串中的换行,把整条字符串当成一行来处理。
(注意:JavaScript 不支持单行模式,但 PHP 支持。)
■ JS 中正则表达式对象的方法:
① exec方法
作用:
根据 正则表达式 检索 字符串 中匹配的值。
如果在字符串中找到匹配的值,就返回该匹配值。
如果没有找到任何匹配的值,就返回 null 。
例如:
var patt = /Hello/g; //创建正则表达式。
var str = 'Hello World';
var rt = patt.exec(str);
alert(rt);
② test方法
作用:
根据 正则表达式 检索 字符串 中匹配的值。
如果在字符串中找到匹配的值,就返回 true ,否则返回 false 。
例如:
var patt = /Hello/g; //创建正则表达式。
var str = 'Hello World';
var rt = patt.test(str);
alert(rt);
■ JS 中字符串对象与正则表达式相关的方法:
① search方法
作用:
在 字符串 中检索与 正则表达式 匹配的值。
如果找到匹配的值,就返回相对位置。
如没有找到任何匹配的值,就返回 -1 。
例如:
var patt = /Hello/g; //创建正则表达式。
var str = 'Hello World';
var rt = str.search(patt);
alert(rt);
② match方法
作用:
在 字符串 中检索与 正则表达式 匹配的值。
如果找到匹配的值,就返回一个数组,其中存放了它找到的匹配值的相关内容。
如果没有找到任何匹配的值,就返回 null 。
例如:
var patt = /Hello/g; //创建正则表达式。
var str = 'Hello World';
var rt = str.match(patt);
alert(rt);
③ replace方法
作用:
把 字符串 中与 正则表达式 匹配的值替换为新的内容。
返回替换新内容后的字符串。
例一:
var patt = /Hello/g; //创建正则表达式。
var str = 'Hello World';
var new_str = str.replace(patt,字符串);
例二,利用 正则表达式(反向捕获)把手机号码的中间4个数字替换为*号:
var patt = /([0-9]{3})[0-9]{4}([0-9]{4})/;
var number = '13523622989';
number = number.replace(patt,"$1****$2"); // ★注意:这里要用到 反向捕获 ,并且用 $ 代替 \ 。
例三,清除网页代码中的 script 代码:
var patt = /<script[\w\W]+?<\/script>/gi;
var webcode = "网页代码";
webcode = webcode.replace(patt,'');
④ split方法
作用:
根据与 正则表达式 匹配的值,把字符串分割为数组。
返回字符串分割后的数组。
例如:
var patt = /Hello/g; //创建正则表达式。
var str = 'Hello World';
var arr = str.split(patt,3);
★ 小括号
( ) 用于定义子表达式。
★ 反向捕获:
例如,要找四位数,第一位与第四位相同,第二位与第三位相同,如9889。
则正则表达式为: var patt = /(\d)(\d)\2\1/gi;
注意:
\1 代表第一个小括号中的内容。
\2 代表第二个小括号中的内容。
■ 限定符(量词):
{出现次数}
{3,4} //出现3或4次。★JS默认使用贪婪匹配模式,即尽可能匹配最多的内容。
{3,} //出现最少3次,最多可以无限次。
+ //表示出现1次到任意多次,等效于 {1,} 。
* //表示出现0次到任意多次,等效于 {0,} 。
? //表示出现0次到1次,等效于 {0,1} 。
★ 注 意 :
JavaScript 中( Python 也一样)正则表达式 的默认匹配模式是:尽可能匹配最多的内容,这种匹配模式称为“
贪婪模式”。
只需要在 限定符 后加上
? 问号,就可以将匹配模式改为“
非贪婪模式”了,例如:
a.*b 是 匹配 以a开始,以b结束 的字符串。如果把它应用于 aabab 的话,由于默认是“贪婪模式”它会匹配 aabab 。
a.*?b 是 匹配最短的 以a开始,以b结束 的字符串。如果把它应用于aabab的话,它会匹配 aab 和 ab 。
a.*?b 是 匹配最短的 以a开始,以b结束 的字符串。如果把它应用于aabab的话,它会匹配 aab 和 ab 。
■ 字符匹配符(中括号):
[a-z] //表示可以匹配a-z中任意一个字符。
[A-Z] //表示可以匹配A-Z中任意一个字符。
[0-9] //表示可以匹配0-9中任意一个字符。
[abcd] //表示可以匹配abcd中任意一个字符。
[^a-z] //表示可以匹配不是a-z中的任意一个字符。
[^A-Z] //表示可以匹配不是A-Z中的任意一个字符。
[^0-9] //表示可以匹配不是0-9中的任意一个字符。
[^abcd] //表示可以匹配不是abcd中的任意一个字符。
■ 元字符:
\d 相当于 [0-9]
\D 相当于 [^0-9]
\w 相当于 [a-zA-Z0-9_]
\W 相当于 [^a-zA-Z0-9_]
\s 匹配任何空白字符(包括空格,制表符 即Tab 等)。
\S 匹配任何非空白字符。
\b 查找位于单词的开头或结尾的匹配,即 \bis\b 就代表 is 是独立的一个单词。
\B 查找不处在单词的开头或结尾的匹配,即 \Bis\b 就代表 is 不是一个独立的单词,有可能是 this 的最后两个组成字母。
. 匹配除了\n(换行符)之外的任意一个字符。如果想匹配“
.”要使用转意字符
\. 。
★ 注 意 :
因为
. 不能代表换行符,而且在 JavaScript 中( Python 也一样)没有“单行模式”。
所以在JS(或 PY )中,当我们需要匹配一个包含换行符的任意字符时,无法通过
. 实现。
解决方法:可以用
[\d\D] 或
[\w\W] 或
[\s\S] 代表
包含换行符的任意字符。
在 Pyhton 中 还可以通过
.*? 加
re.S 修饰符 代表
一切无限多的字符 (这是 PY 中 正则 的 惯用法)。
■ 定位符:
^ 匹配开始位置,例如 /^abc/gi 代表字符串是以 abc 开头的。
$ 匹配结束位置,例如 /xyz$/gi 代表字符串是以 xyz 结尾的。
■ 选择匹配符(或):
| 例如:/a|b|c/gi 就表示 可以是a或b或c其中之一。
★ 匹配中文:
\un 其中n代表一个用4个十六进制数字表示的 Unicode 字符。
例如:\u3000 表示中文全角空格。
在 Unicode 编码中,中文对应的范围是 4e00 - 9fa5 。
所以,我们可以通过以下正则表达式匹配所有中文字符:
var patt = /[\u4E00-\u9FA5]/g;
★ 预 查 :
预查 就是预先查看后续的字符。预查是“非获取匹配”,即 该匹配不需要获取供以后使用。
预查不消耗字符。即 接下来的匹配 并不是从 预查结束的位置 开始,而是从 预查开始的位置 继续匹配。
打一个生动的比喻:
目的地在前方200米。
当你走到100米时,停了下来。你用望远镜向前看,看到了目的地。
此时,虽然你看到了目的地,但你依然停留在100米的地方。
☆ 预查 只是用『望远镜』向前看一下。
例一,要求找进行时的单词的词根部分:
var str = document.getElementsByName('str')[0];
var patt = /\b\w+(?=ing)/g;
alert(str.value.match(patt));
例二,要求找不是进行时的单词:
var str = document.getElementsByName('str')[0];
var patt = /\b\w+(?!ing)\w{3}\b/g; //
★高!
alert(str.value.match(patt));
■ 实用案例:
1.验证手机号码:
var tel = document.getElementsByName('tel')[0];
var patt = /^1[34578]\d{9}$/;
if(patt.test(tel.value)){
alert('是手机号');
}else{
alert('不是手机号');
}
2.采集手机号码:
var article = '文章内容';
var patt = /1[34578]\d{9}/g;
alert(article.match(patt));
3.验证 email :
var email = document.getElementsByName('email')[0];
var patt = /^[a-z0-9]\w*(\.[a-z0-9]+)*@[a-z0-9][a-z0-9-]*(\.[a-z0-9][a-z0-9-]*)+$/i;
if(patt.test(email.value)){
alert('是 email');
}else{
alert('不是 email');
}
4.清除网页代码中的 script 代码:
var webcode = "网页代码";
var patt = /<script[\w\W]+?<\/script>/gi;
webcode = webcode.replace(patt,'');
5.把手机号码的中间4个数字替换为*号:
var patt = /(\d{3})\d{4}(\d{4})/;
var number = '13523622989';
number = number.replace(patt,"$1****$2"); // ★注意:这里要用到【反向捕获】,并且用 $ 代替 \ 。
6.清除重复字符:
var str = 'aaabbbccc';
var patt = /([\w\W])\1+/g;
str = str.replace(patt,'$1');
7.清楚中文字符:
var str = 'Hello 世界';
var patt = /[\u4E00-\u9FA5]/g;
str = str.replace(patt,'');
8.检验用户名,要求只能由 字母、数字、下划线、中文 组合而成,并且字符个数至少为4:
var usname = document.getElementsByName('username')[0];
var patt = /^[\w\u4E00-\u9FA5]{4,}$/;
if(patt.test(usname.value)){
alert('用户名有效');
}else{
alert('用户名无效');
}