乐趣区

关于javascript:正则表达式

1. 什么是正则表达式

(1)正则表达式是由一个字符序列造成的搜寻模式;(2)当你在文本中搜寻数据时,你能够用搜寻模式来形容你要查问的内容;(3)正则表达式能够式一个简略的字符,或式一个更简单的模式
(4)正则表达式可用于所有文本搜寻和文本替换的操作。

2. 正则表达式的创立

(1)字面量(间接量)var reg=/ 正则表达式 / 修饰符;
    var reg = /hello/img;
(2)构造函数
    var reg = new RegExp('正则表达式','修饰符');
    var reg = new RegExp('hello','img');
其中 i 是 ignoreCase, 代表匹配时漠视大小写
m 代表 multiline, 示意多行匹配
g 代表 global, 示意全局匹配

3. 正则表达式实例办法

(1)exec()  用来匹配字符串中合乎正则表达式的字符串
    如果匹配到,返回一个数组[匹配到的内容,index:在 str 中匹配到的起始地位,input:参数字符串,groups:undefined]
    如果匹配不到,则返回 null。(2)test() 用来测试待检测的字符中是否有能够匹配到正则表达式的字符串,如果有返回 true, 否则返回 false。留神:以上两种办法都会辨别是否是全局的。(3)toString/toLocaleString()  把正则表达式的内容转化成字面量模式字符串
(4)valueOf() 返回正则自身

4. 正则表达式实例属性

(1)lastIndex
    当没设置全局匹配时,该值始终为 0。设置了全局匹配时,每执行一次 exec/test 来匹配,lastIndex 就会移向匹配到的字符串的下一个地位。当指向的地位后没有能够再次匹配的字符串时,下一次执行 exec()返回 null,test()执行返回 false,而后 lastIndex 归零,从字符串的结尾从新匹配一轮。(2)ignoreCase,global,multiline
(3)source 返回字面量模式的正则表达式

5. 字符汇合

一个字符汇合,也叫字符组。匹配汇合中的任意一个字符。你能够应用连‘—’指定一个范畴。(1)[abc]查找方括号之间的任何字符 
    var reg = /[abc]/ 
     console.log(reg.test('abc qwe abd'));
    只有蕴含有 a 或者 蕴含有 b 或者蕴含有 c 都返回 true
(2)[0-9]查找任何从 0 到 9 的数字
(3)[^xyz]反义字符或补充字符集,也叫反义字符组。也就是说,它匹配任意不在括号内的字符。也能够通过应用连字符‘-’指定一个范畴内的字符。(4)边界符
    ^ 匹配输出开始。示意匹配行首的文本(以谁开始)。如果多行(multiline)标记设为 true,该字符也会匹配一个断行符后的开始处。$ 匹配输出结尾。示意匹配行尾的文本(以谁完结)。如果多行(multiline)标记被设为 true, 该字符也会匹配一个断行符的前结尾处。如果 ^ 和 $ 在一起,示意必须是准确匹配。var rg = /abc/; 
    // /abc/ 只有蕴含有 abc 这个字符串返回的都是 true
    console.log(rg.test('abc'));  //true
    console.log(rg.test('abcd')); //true
    console.log(rg.test('aabcd'));//true
    console.log('---------------------------');
    // 必须是以 abc 结尾的字符串才会满足
    var reg = /^abc/;
    console.log(reg.test('abc')); // true
    console.log(reg.test('abcd')); // true
    console.log(reg.test('aabcd')); // false
    console.log('---------------------------');
    // 必须是以 abc 结尾的字符串才会满足
    var reg = /abc$/;
    console.log(reg.test('abc')); // true
    console.log(reg.test('qweabc')); // true
    console.log(reg.test('aabcd')); // false
    console.log('---------------------------');
    var reg1 = /^abc$/; // 准确匹配 要求必须是 abc 字符串才符合规范
    console.log(reg1.test('abc')); // true
    console.log(reg1.test('abcd')); // false
    console.log(reg1.test('aabcd')); // false
    console.log(reg1.test('abcabc')); // false
(5)字符汇合与 "^" 和 "$" 一起应用
    // 三选一 只有是 a 或者是 b  或者是 c 这三个字母才返回 true
    var rg1 = /^[abc]$/; 
    console.log(rg1.test('aa'));//false
    console.log(rg1.test('a'));//true
    console.log(rg1.test('b'));//true
    console.log(rg1.test('c'));//true
    console.log(rg1.test('abc'));//false
    //26 个英文字母任何一个字母返回 true  - 示意的是 a 到 z 的范畴  
    var reg = /^[a-z]$/ 
    console.log(reg.test('a'));//true
    console.log(reg.test('z'));//true
    console.log(reg.test('A'));//false
    // 字符组合
    // 26 个英文字母 (大写和小写都能够) 任何一个字母返回 true
    var reg1 = /^[a-zA-Z0-9]$/; 
    // 取反 方括号外部加上 ^ 示意取反,只有蕴含方括号内的字符,都返回 false。var reg2 = /^[^a-zA-Z0-9]$/;
    console.log(reg2.test('a'));//false
    console.log(reg2.test('B'));//false
    console.log(reg2.test(8));//false
    console.log(reg2.test('!'));//true
(6)\b   匹配一个零宽单词边界(zero-width word boundary),示意一个单词(而非字符)边界,也就是单词和空格之间的地位,或者字符(\w)与字符串结尾或者结尾之间的地位。\B  匹配一个零宽非单词边界(zero-width non-word boundary),与 "\b" 相同。var str = 'Hello World Hello JavaScript';
    var reg1 = /\bHello\b/g;
    var reg2 = /\BScrip\B/g;
    console.log(reg1.exec(str));
    console.log(reg2.exec(str));
(7)字符类
    . 匹配除换行符 \n 和回车符之外的任何单个字符,等效于 **[^\n\r]**
    \d 匹配一个数字字符,等效于[0-9]
    \D  [^0-9]
    \w 匹配包含下划线的任何单个字符,包含 A~Z,a~z,0~9 和下划线 **"_"**,等效于  [a-zA-Z0-9_]
    \W [^a-zA-Z0-9_]
    \s 匹配任何 Unicode 空白字符,包含空格、制表符、换页符等,等效于[\f\t\n\r]
    \S[^\f\t\n\r]
(8)数量词
    *   >= 0 次
    +   ≥1 次?0 或 1 次
    {n} n 次
    {n,} ≥n 次
    {n,m} n 到 m 次

6. 案例

(1)匹配 QQ 号
    // 不能以数字 0 开始,只能由数字组成,长度为 5 -11 位
    var reg = /^[1-9]\d{4,10}$/;
    var str1 = "12311111111";
    var result1 = reg.exec(str1);
    console.log(result1);
(2)匹配身份证号
    // 不能以数字 0 结尾,只能由数字组成,最初一位可能是 x,X,数字
    var reg = /^[1-9]\d{16}[xX\d]$/;
    var str = "456337189654326541";
    var result = reg.exec(str);
    console.log(result);
(3)验证是否为 11 位无效手机号码?以 1 为结尾
    第二位为 3,4,5,7,8 中的任意一位
    最初以 0 - 9 的 9 个整数结尾
    var reg = /^1[34578]\d{9}$/;
    var str = '18376436798';
    console.log(reg.exec(str));
(4)var pattern=/(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!|@|#|%|&])^([a-zA-Z0-9!@#%&]{6,})$/
    console.log(pattern.test('Ad5d6!'));

7. 反复形式

(1)贪心模式:尽可能多的匹配(首先取最多可匹配的数量为一组进行匹配),当匹配残余的字符串,还会持续尝试新的匹配,直到匹配不到为止,为默认模式。// 对字符串 "123456789",匹配其中的数字 3 - 6 次:\d{3,6},先匹配数字呈现 6 次的字符串(123456),而后再从残余字符串(789)中匹配呈现数字 3 次的状况,残余字符若没有呈现数字 3 次则进行匹配.
    var str = "123456789";
    var reg = /\d{3,6}/g;
    console.log(reg.exec(str)); //['123456', index: 0, input: '12345678', groups: undefined]
    console.log(reg.exec(str)); // ['789', index: 6, input: '123456789', groups: undefined]
    console.log(reg.exec(str)); // null
(2)非贪心模式:尽可能少的匹配(每次取起码匹配的数量为一组进行匹配),直到匹配不到为止
// 对字符串 "123456789",匹配其中的数字 3 - 6 次:\d{3,6},先匹配数字呈现 3 次的字符串(123),而后再从残余字符串(456789)中匹配呈现数字 3 次的状况,残余字符若没有呈现数字 3 次则进行匹配.
    var str = "123456789";
    var reg = /\d{3,6}?/g;
    console.log(reg.exec(str)); //['123', index: 0, input: '123456789', groups: undefined]
    console.log(reg.exec(str)); // ['456', index: 3, input: '123456789', groups: undefined]
    console.log(reg.exec(str)); // ['789', index: 6, input: '123456789', groups: undefined]

8. 抉择,分组,援用

(1)抉择
    字符 "|" 用于分隔供选择的字符,选择项的尝试匹配秩序是从左到右,直到发现了匹配项,如果右边的选择项匹配,就疏忽左边的匹配项,即便它能够产生更好的匹配。var reg = /html|css|js/

console.log(reg.exec(‘qweqwehtmlcss’)); // html

(2)分组
    上面的正则表达式能够匹配 'briupbriupbriup'
        /briupbriupbriup/
        而另一种更优雅的写法是:/(briup){3}/
(3)候选
    一个分组中,能够有多个候选表达式,用 | 分隔:var reg = /I Like (basketball|football|table tennis)/
              console.log(reg.test('I Like basketball')); //true
              console.log(reg.test('I Like football')); //true
              console.log(reg.test('I Like table tennis')); //true
(4)捕捉与援用
    被正则表达式匹配(捕捉)到的字符串会被暂存起来。其中,由分组捕捉的串会从 1 开始编号,于是咱们能够援用这些串:var reg = /(\d{4})-(\d{2})-(\d{2})/

    var date = '2021-08-29'

    reg.test(date)
    // 捕捉之前要先 test/exec
    console.log(RegExp.$1); //2021
    console.log(RegExp.$2); //08
    console.log(RegExp.$3); //29
    $1 援用了第一个被捕捉的串,$2 是第二个,顺次类推。(5)嵌套分组的捕捉
    如果碰到相似 /((apple) is (a (fruit)))/ 的嵌套分组,捕捉的程序是什么?
    var reg = /((apple) is (a (fruit)))/
    var str = "apple is a fruit"
    reg.test(str) // true
    RegExp.$1 // apple is a fruit
    RegExp.$2 // apple
    RegExp.$3 // a fruit
    RegExp.$4 // fruit
    规定是以左括号呈现的程序进行捕捉
(6)援用
    正则表达式里也能进行援用,这称为反向援用:var reg = /(\w{3}) is \1/
    console.log(reg.test('kid is kid')); // true
    console.log(reg.test('dik is dik')); // true
    console.log(reg.test('kid is dik')); // false
    console.log(reg.test('dik is kid')); // false
    \1 援用了第一个被分组所捕捉的串,换言之,表达式是动静决定的。留神,如果编号越界了,则会被当成一般的表达式
    var reg = /(\w{3}) is \6/;
    reg.test('kid is kid'); // false
    reg.test('kid is \6');  // true

9.String 对正则表达式的反对

(1)search() 查找字符串中是否有匹配正则的字符串,有则返回字符串第一次呈现时的地位,无则返回 null, 正则中无论是否有全局匹配都不会影响返回后果
(2)match() 匹配字符串中合乎正则表达式的字符串,并返回该字符串的一个数组,其中包含字符串内容、地位。如果正则设置全局匹配,则 ** 一次性返回所有 ** 合乎正则表达式的字符串数组
  如果其中增加了分组,返回符合要求的字符串以及分组的一个数组,但如果同时开启全局匹配则不会在数组中增加分组内容
    var str = 'hello world hello';
    var reg1 = /hello/;
    var reg2 = /hello/g;
    var reg3 = /(he)llo/;
    var reg4 = /(he)llo/g;
    // 匹配字符串中合乎正则表达式的字符串,并返回该字符串的一个数组,其中包含字符串内容、地位
    // ['hello', index: 0, input: 'hello world hello', groups: undefined]
    console.log(str.match(reg1));
    // 如果正则设置全局匹配,则一次性返回所有合乎正则表达式的字符串数组
    // ['hello', 'hello']
    console.log(str.match(reg2));
    // 如果其中增加了分组,返回符合要求的字符串以及分组的一个数组
    // [
    //   'hello',
    //   'he',
    //   index: 0,
    //   input: 'hello world hello',
    //   groups: undefined
    // ]
    console.log(str.match(reg3));
    // 如果同时开启全局匹配则不会在数组中增加分组内容
    // ['hello', 'hello']
    console.log(str.match(reg4));
(3)split() 
    // 以某种模式宰割字符串 split()
    var str = "terry134briup156lisi12zhangsan";
    // 当数字呈现一次或屡次时
    var reg = /\d+/;
    var result = str.split(reg);
    console.log(result); // ['terry', 'briup', 'lisi', 'zhangsan']
(4)replace()
    // 满足正则表达式条件的内容将被替换
    var str = 'javascript'
    // 如果开启全局模式 则替换所有满足条件的字符
    var reg = /javascript/;
    // replace(正则表达式, 要替换的内容)
    var result = str.replace(reg, 'java');
    console.log(result); //java
    console.log(str); //javascript

前瞻表达式

在正则表达式当中有个货色叫做前瞻,有的管它叫零宽断言

    |  (?=exp)   | 正向前瞻 | 匹配前面满足表达式 exp 的地位 |
    |  (?!exp)   | 负向前瞻 | 匹配前面不满足表达式 exp 的位 |
  var str = 'Hello, Hi, I am Hilary.';
  // 前面肯定要匹配什么
  var reg = /H(?=i)/g;
  var newStr = str.replace(reg, "T");
  console.log(newStr);//Hello, Ti, I am Tilary.
  在这个 DEMO 中咱们能够看出正向前瞻的作用,同样是字符 "H",然而只匹配 "H" 前面紧跟 "i" 的 "H"。就相当于有一家公司 reg,这时候有多名 "H" 人员前来应聘,然而 reg 公司提出了一个硬条件是必须把握 "i" 这项技能,所以 "Hello" 就天然的被淘汰掉了。那么负向前瞻呢?情理是雷同的:var str = 'Hello, Hi, I am Hilary.';
    // 前面肯定要不匹配什么
    var reg = /H(?!i)/g;
    var newStr = str.replace(reg, "T");
    console.log(newStr);//Tello, Hi, I am Hilary.
    在这个 DEMO 中,咱们把之前的正向前瞻换成了负向前瞻。这个正则的意思就是,匹配 "H", 且前面不能跟着一个 "i"。这时候 "Hello" 就能够胜利的应聘了,因为 reg 公司批改了他们的招聘条件,他们说 "i" 这门技术会有损公司的企业文化,所以咱们不要了。
退出移动版