正则表达式
用来匹配字符串的一系列匹配符,具有简洁、高效的特点(java、javascript、php都有应用):
在dos命令框中也应用匹配字符
dir *.doc
dir ?.* (?代表一个字符)
能够看懂
能够理解
普通匹配符介绍
说明: 正则在不同语言的支持方法语法略有不同 js、java、php …
1:在js中如果要引入正则表达式,则需要:/…/(即以/开头,以/结尾,中间写入正则表达式)
比如 r=str.match(/1[3589]\d/);
2:stirng.match(/表达式/) 匹配成功返回数组,否则为null
3:普通匹配符: 能够匹配以之对应的字符
比如
var str = “Hello Java”;
var r=str.match(/a/); 返回是a
4:默认正则区分大小写
5: i、g、m 称为正则标记符(参数): i:不区分大小写 g:全局匹配 m: 多行匹配
默认匹配到第一个后自动结束 但是如果是全局匹配
var str = “Hello Java”;
var r=str.match(/a/); 返回是两个a 一个数组
var str = “Hello Java Hello java”;
var r=str.match(/java/gi);
6:能够匹配多个字符中的其中一个匹配符: \d: 0~9 \w: 字母、数字、下划线 .:匹配除换行的所有字符(\d \w . 都只能匹配一个)
str = "hello 2016";
r=str.match(/\d/g); //返回2016四个数字组成的数组
r=str.match(/\d/); //返回2组成的数组
r=str.match(/\w/); //返回hello2016九个数字组成的数
\n代表换行
str = "hello\n2016";
r=str.match(/./g);//返回hello2016
str = "hello 2016";
r=str.match(/\w.\d/g);//返回o 2和016组成的数组
自定义匹配符
7:能够自定义规则的匹配符[],如果在[^]代表取反
str = "198" // 第二数值必须是 3|5|8|9其中的一种
r=str.match(/1[3589]\d/);
如果写成r=str.match(/1[3,5,8,9]\d/);则"1,8"、"1,1"全部可以匹配成功,因为[3,5,8,9]包括逗号
r=str.match(/1[^3589]\d/);第一个字母必须是1,第二个可以是非3,5,8,9中的任意,包括数字和字母,最后一个字母必须是数字
r=str.match(/1[3589]\d\d\d\d\d\d\d\d\d/);//匹配11位手机号,第二位数字是3或者5或者8或者9
这样的写法很繁琐
所以出现了表示次数的通配符
8:用来修饰匹配次数的匹配符 {n}: 代表前面匹配符出现n次
{n,m}: 出现次数 n~m之间 {n,}: n~max {,n}: min~n 不涉及完整匹配
+: 1~max ?: 0~1 *: 0~max
str = "18312345678";
r=str.match(/1[3589]\d{9}/);//代表\d出现9次
比如
str = "t-1530123912819238";
r = str.match(/1[3589]/\d{9});
//这样子也是可以匹配成功的
正则表达式的完整匹配
^: []中^代表取反,但是在外面代表的是从开始匹配
$:持续匹配的结束
str = "15312345678";
r=str.match(/^1[3589]\d{9}$/);
注意 str = “15312345678-15312345678”;匹配不成功,因为 $:持续匹配的结束,而不是从后向前匹配
10:特殊符号如何匹配,在正则中:^ $ . \ [] 这些符号在匹配的时候需要加\ (转义符)
str = "153^.$[]";
r=str.match(/\^\.\$\[\]$/);
//代表匹配 ^和. 以及 [ 和 ] 以及 $ 特殊字符
11: 条件分支 | 与 ()
str = " 123.png";
str.match(/\.[png|gif|jpe?g]/);
str.match(/\.(png|gif|jpe?g)/);
没有匹配成功
[png|gif|jpe?g] 里边是一些独立的功能
如果是 “12.i”可以匹配成功
注意:
(): 1: 括号中的内容,成为一个独立的整体!
2: 括号的内容可以进行分组,单独匹配,不需要此功能则(?:)
所以正确的:
str = "12&3.jpeg";
r=str.match(/\.(?:png|gif|jpe?g)$/);
12.数值的匹配
第一:把合法的数值写出并分析规律
第二:根据规律编写正则,并且测试非法数值
分析数值的组成部分
符号 | 整形 | 小数 | 科学计算法
str = "-12.34E5";
/^(-?)(0|[1-9]\d*)(\.\d+)?([eE][-+]\d+)?$/
r = str.match(/^(-?)(0|[1-9]\d*)(\.\d+)?([eE][-+]?\d+)?$/);
但是这种会分组匹配,返回多个数组值 如果不想让分组匹配成功
r = str.match(/^(?:-?)(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][-+]?\d+)?$/);
//一般不这样用,使用test方法
但是一般用test方法 则会返回ture和false,直接判断是否匹配成功;
(仅仅针对match方法)
整体没有匹配,分组就不会去匹配
13.中文的处理:默认采用的是双字节,在计算机中通过ASCII对应表来输入汉字
通过[ ]来设置中文的范围即可 escape()方法可以将字符串转换为ASCII码 unescape() 可以把编码转换为中文
ASCII码:美国标准信息交换码
“一” 首个汉字 “%u4E00”
“龥” 最后一个汉字 “%u9FA5”
str = 'hellow 中国';
r=str.match(/[\u4E00-\u9FA5]/g);
r=str.match(/[\u4E00-\u9FA5]/g);
str = '欕eom旕eos瓰fenwa覅fiao猤fui甴gad嚿geo啹geu喼gib嗰go兝gongfen兣';
r=str.match(/[\u4E00-\u9FA5]/g);
匹配身份证号:
var patrnIdNo=/(^\d{15}$)|(^\d{17}([0-9]|X)$)/;
14:贪婪与懒惰
str = "aabab";
str.match(/a.*b/);
在正则中默认是贪婪模式(尽可能多的匹配)
此处匹配结果是aabab
但是可以在修饰数量的匹配符(* + ? {})后面添加? 则代表懒惰
比如
str = "aabab";
str.match(/a.*?b/);
匹配结果是aab 和ab