正则表达式语法介绍

时间:2021-10-07 16:22:55

正则表达式

用来匹配字符串的一系列匹配符,具有简洁、高效的特点(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

正则表达式语法介绍