27-正则表达式一

第二十七章.正则表达式一

一.正则表达式

正则表达式是一个查找和替换字符串的强有力的工具。

在 JavaScript 中,正则表达式通过内置的“RegExp”类的对象来实现,并与字符串集成。

  • 例子

    常规写法:

//提取出str中所有的数字组成一个数组 ["188","38","3","29"]

let str = "特务兔187伟哥38小希3薄荷29";

function fn( str ){
      let arr = [];
      let s = "";
      for (let i=0;i<str.length;i++){
        let thisChar = str[i];
        if (isNaN(thisChar)) {
          s && arr.push(s);
          s = "";
        }else{
          s += thisChar;
        }
      }
      s && arr.push(s);
      return arr;
    }

console.log(fn(str));

正则写法:

let str = "特务兔187伟哥38小希3薄荷29";

function fn(str){
     return str.match(/\d+/g);
 }

console.log(fn(str));
  • 如何定义一个表达式
let s = "外经贸abc薄荷er";

let r = /abc/;

 /*正则要结合一些方法来使用
  *
  *   reg.test(str)
  *     检测str中有没有reg规则,有返回true,没有则返回false
  * */

 console.log( r.test(s) );//true
let s = "外经贸abc薄荷er";

// let r = /x/;

//如果要根据某个字符串变量来制定正则规则
 let x = "abc";
 let r = new RegExp(x);

 console.log( r.test(s) );//true
  • 转义
/*
    * 转义:
    *   1.特殊符号需要转义
    *
    *   2.和特殊的字符结合有特殊的意义
    *   \d   数字
    *   \D   非数字
    *
    *   \s   空格
    *   \S   非空格
    *
    *   \w   字符(字母、数字、下划线)
    *   \W   非字符
    *
    *   \b   单词边界(起始位置、结束位置、所有的非字符也就是\W)
    *   \B   非单词边界
    * */
let str1 = "好好学习,天天向上!";
let str2 = 123456;

let reg1 = /\d/;
let reg2 = /\D/;

console.log(reg1.test(str));//false  \d 匹配数字
console.log(reg1.test(str2));//ture

console.log(reg2.test(str));//true   \D 匹配非数字
let str1 = "好好学习,   天天向上!";
let str2 = "     ";
let reg1 = /\s/;
let reg2 = /\S/;

console.log(reg1.test(str1));//true   \s 匹配空格

console.log(reg2.test(str1));//true   \S 匹配非空格
console.log(reg2.test(str2));//false   转义\S为fasle情况的只有字符串全是空格的情况 
let str = "一块五花肉花一块五, abc_123";

let reg1 = /\w/;
let reg2 = /\W/;

console.log(reg1.test(str));//true     \w  字符(字母、数字、下划线)
console.log(reg1.test(str));//false
let str1 = 'Bob is a student.';
let str2 = 'Bobby is a student.';

let reg1 = /Bob/;
let reg2 = /\bBob\b/;

console.log(reg1.test(str1));//true    
console.log(reg1.test(str2));//true    但是只想匹配的是Bobby

console.log(reg2.test(str2));//false   \b 匹配边界

/*
*注意所有的汉字都是边界词
*/
  • 量词
/*
 * 量词
 *   {n}  n个
 *   {n,m} 最少n个,最多m个
 *   {n,} 最少n个,最大无限制
 *
 * 特殊量词
 *   {1,}   +
 *   {0,1}  ?
 *   {0,}   *
 *
 * 贪婪与惰性
 *   默认贪婪
 *   量词加? 变成惰性
 * */

let str = "18327604423";

//let reg = /\d\d\d\d\d\d\d\d\d\d\d/; //这样写很烦,人都写傻了
let reg = /\d{11}/;

let reg2 = /\d{4,}?/;
let reg3 = /\d+?/;

 /*
  * str.match(reg)
  *   匹配成功返回一个数据,匹配失败返回null
  * */
console.log( str.match(reg) );//["18327604423", index: 0, input: "18327604423", groups: undefined]
console.log( str.match(reg2) );//["1832", index: 0, input: "18327604423", groups: undefined]
console.log( str.match(reg3) );//["1", index: 0, input: "18327604423", groups: undefined]
let str1 = "皮卡卡同学"; //皮卡卡叠词情况
let str2 = "皮卡同学";

let reg = /皮卡同学/;

console.log(str1.match(reg)); //null
console.log(str2.match(reg)); //["皮卡同学", index: 0, input: "皮卡同学", groups: undefined]
/*
 * 贪婪与惰性
 *   默认贪婪
 *   量词加? 变成惰性
 * */

let str = "Sherry酱是一个美女";
 
let reg1 = /Sheey是个美女/;//null
let reg2 = /Sherry酱?是一个美女/; // 量词?针对前面一个规则生效,“酱”
let reg3 = /Sherry酱?/;
let reg4 = /Sherry酱??/;//惰性匹配 Sherry


console.log(str.match(reg1));//null
console.log(str.match(reg2)); //["Sherry酱是一个美女", index: 0, input: "Sherry酱是一个美女", groups: undefined]

console.log(str.match(reg3)); //["Sherry酱", index: 0, input: "Sherry酱是一个美女", groups: undefined]

console.log(str.match(reg4)); //["Sherry", index: 0, input: "Sherry酱是一个美女", groups: undefined]
  • 修饰词
/*
    修饰词
    * i 不区分大小写
    * g 全局匹配
    *
    * m 换行匹配
    *
    * */

    let str1 = "abc";

    let reg = /ABC/;
    let reg1 = /Abc/i; //不区分大小写
    let reg2 = new RegExp("Abc","i");//第二种写法

    console.log(reg.test(str));//false
    console.log(reg1.test(str));//true
    console.log(reg2.test(str));//true
 let str = "皮卡:123456,阿远:7654321,小希:897897";

 let reg = /\d+/;

console.log(str.match(reg));
//["123456", index: 3, input: "皮卡:123456,阿远:7654321,小希:897897", groups: undefined]
//match方法的特点成功匹配到到就结束了

//匹配所有的
let reg2 = /\d+/g;//全局匹配
console.log(str.match(reg2));// ["123456", "7654321", "897897"]
  • 子项
/*
 * 子项
 *   ()
 *
 * */

let str = "abcabcabcabcabcabcabcasdasdasdasd"
let reg1 = /(abc)+/;

console.log(str.match(reg1));
/*
["abcabcabcabcabcabcabc", "abc", index: 0, input: "abcabcabcabcabcabcabcasdasdasdasd", groups: undefined]
*/

let reg2 = /(abc)+(asd)+/;
console.log(str.match(reg2));//match方法,匹配会显示子项,如图所示
/*
["abcabcabcabcabcabcabcasdasdasdasd", "abc", "asd", index: 0, input: "abcabcabcabcabcabcabcasdasdasdasd", groups: undefined]
*/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2FClFAye-1615990911655)(C:/Users/%E7%AB%B9%E9%9D%92%E6%9A%AE%E9%9B%A8/AppData/Roaming/Typora/typora-user-images/1592114976945.png)]

//注意:若是全局匹配
let reg3 = /(abc)+(asd)+/g;//全局匹配,就不会显示子项了,只显示匹配结果
console.log(str.match(reg2));//如图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MtSbnLlO-1615990911660)(C:/Users/%E7%AB%B9%E9%9D%92%E6%9A%AE%E9%9B%A8/AppData/Roaming/Typora/typora-user-images/1592115220126.png)]

//最近一次子项匹配结果会存储到RegExp里面
console.dir(RegExp.$1);//abc
console.dir(RegExp.$2);//asd
1592115465949
  • 字符集
    /*
    * 字符集
    *   []
    *
    *   1.或者的意思
    *   2. -写法
    *
    * 很多在外面有特殊意义的字符在 [] 中是没有特殊意义的
    *   在 [] 中有特殊意义的有  -  \
    *
    * 汉字范围
    *   [\u4e00-\u9fa5]
    *
    *
    * */

    let str1 = "a皮卡";
    let str2 = "b皮卡";
    let str3 = "c皮卡";
    let reg = /[abc]皮卡/;
    console.log(str1.match(reg));//["a皮卡", index: 0, input: "a皮卡", groups: undefined]
    console.log(str2.match(reg));//["b皮卡", index: 0, input: "a皮卡", groups: undefined]
    console.log(str3.match(reg));//["c皮卡", index: 0, input: "a皮卡", groups: undefined]
 let str = '7';
 let reg = /[2-7]/;//匹配[2,7]之间
 console.log(str.match(reg));//["7", index: 0, input: "7", groups: undefined]
let str = "gsahduiAAAdsakdDDDsds";
let reg = /[f-kA-Z]+/g;
console.log(str.match(reg));//["g", "h", "iAAA", "k", "DDD"]
let str = "(";
let reg = /[(/]/;
console.log(str.match(reg));//["(", index: 0, input: "(", groups: undefined]
 let str = '#皮卡';
 let reg = /[^0-9a-zA-Z]皮卡/;
console.log(str.match(reg));//["#皮卡", index: 0, input: "#皮卡", groups: undefined]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值