js基础14(正则)

1、正则表达式

一套规则,一般用来处理字符串的查询和替换

1.1 创建正则规则
  • 字面量写法:/正则表达式的规则/
  • 通过正则的构造函数来生成一个对象:new RegExp(字符串)
    这里的字符串就是规则
1.2 正则表达式的方法
  • test():匹配成功返回true,匹配失败返回false
    语法:正则规则.test(源字符串)
  • match():返回匹配规则的内容
    语法:源字符.match(正则规则)
  • replace():字符串方法,接受两个参数,替换
    语法:源字符.replace(正则规则,字符串/函数)
    • 第一个参数:正则或者是字符串(一般使用正则)
    • 第二个参数:字符串或者是function,但是必须返回用于替换
    • 位置置换
  • exec():依次执行,超过就是null
    语法:正则规则.exec(源字符串)
const str = "魔道祖师真好看";
// 字面量写法
const reg1 = /魔道祖师/; //这里不能匹配。因为两个斜杠之间就是规则
// 正则构造函数
const reg2 = new RegExp("魔道祖师");
console.log(reg1.test(str)); // true
console.log(reg2.test(str)); // true
1.3 特殊字符
  • 1、转义符: \ 对后面的字符的转译,转义可能发生改变,可能不会
    \n:换行
    \t:空格
    \ \:双转义符号,后面一个被转义为一个普通的斜杠
  • 2、元字符
    \d:转义d,判定数字0-9
    \D:转义D,非数字
    \s:转义s,空格
    \S:转义S,非空格
    \w:转义w,字符(数字,字母,_)
    \W:转义W,非字符(除了w以外的所有东西)
    \b:转义b,判断独立部分(单词边界,起始,结束,连词符(除了\w之外的属于连词符))
    \D:转义D,非独立部分
  • 3、量词:默认是贪婪匹配,以最高次匹配
    • 语法:{min, max}
      最少出现min次,最多出现max次
    • 特殊的量词写法:
      {0,1} 最少出现0次,最多出现1次 = ?
      {0,} 最少出现0次,最多出现无数次 = *
      {1,} 最少出现1次,最多出现无数次 = +
  • 4、标识符
    g:全局匹配
    i:不区分大小写
    m: 换行匹配
    .:匹配所有的字符,除开\n \r \t
    
  • 5、起始符、结束符
    ^:起始符,行首
    $:终止符,行尾
// test()方法
let obj = "{\"a\", 1}";
console.log(obj); // {"a", 1}

const str = "83151561";
const str2 = "asdsds";
const reg = /\d/;
const reg2 = /\D/;
console.log(reg.test(str)); // true
console.log(reg2.test(str2)); // false

const str = "good good study day day up";
const str2 = "good good study day day_up";
const str3 = "good good study day day=up";
const reg = /\bday\b/;
const reg2 = /\bday_\b/;
const reg3 = /\bday=\b/;
console.log(reg.test(str)); // true
console.log(reg2.test(str2)); // false
console.log(reg3.test(str3)); // true

const str = "123456789";
const reg = /\d\d\d/; // 匹配三个连续的数字
const reg2 = /\d{0,1}/; // 量词的写法
console.log(reg2.test(str)); // true
// match()方法
const str = "111111114564564111151515";
const reg = /1+/g; // 在全局匹配数字1无限次
console.log(str.match(reg)); // ["11111111", "1111", "1", "1"]

const str = "1111Abc456abc111a51b51c5";
const reg1 = /abc/; //区分大小写
const reg2 = /abc/i; // 不区分大小写
console.log(str.match(reg1));
 // ["abc", index: 10, input: "1111Abc456abc111a51b51c5", groups: undefined]
console.log(str.match(reg2));
 // ["Abc", index: 4, input: "1111Abc456abc111a51b51c5", groups: undefined]

const str = "32\n12"
const reg = /^12/m; // ^起始符
console.log(str.match(reg));
//["12", index: 3, input: "32↵12", groups: undefined]

const str = "asdwjifwef";
const reg1 =  /^asdwjifwef$/;
const reg = /^a\w*f$/; // 以a开头,f结尾的所有的字符串
console.log(str.match(reg));

const str = "123A456";
const reg = /\d+a/gi; // 数字无穷,a结尾,全局不区分大小写
console.log(str.match(reg));

const str = "123abc456";
const str2 = "abc";
const arr = str.match(str2);
console.log(arr); 
console.log(arr.index); // 出现的位置 
console.log(arr.input); // 母字符串
1.3 贪婪匹配、非贪婪匹配
  • 贪婪匹配:直接写量词就是贪婪,会从最高次开始匹配
  • 非贪婪匹配:在量词后面加?,从最少次次数开始匹配
const str = "AAaaaa123456";
// 贪婪匹配
const reg = /a{0,5}/gi;
// 非贪婪匹配
const reg2 = /a{1,10}?/gi;
console.log(str.match(reg));
// ["AAaaa", "a", "", "", "", "", "", "", ""]
console.log(str.match(reg2));
// ["A", "A", "a", "a", "a", "a"]
  • 子集:() 子集(一个整体),被括号包裹起来的就是一个整体
  • 或者:| 竖线
  • 范围词:[] 有或者的意思
  • 匹配汉字:\u4e00-\u9fa5
  • \1:转义1必须子集搭配使用
const str = "AB aabbba bb";
const reg1 = /ab+/gi;
const reg2 = /(ab)+/gi;
console.log(str.match(reg1)); //  ["AB", "abbb"]
console.log(str.match(reg2)); // ["AB", "ab"]

const str = "abcdefAdsdbfgFH";
const reg = /a|b|g/gi;
const reg2 = /[a-z]/g;
console.log(str.match(reg)); // ["a", "b", "A", "b", "g"]
console.log(str.match(reg2)); // ["a", "b", "c", "d", "e", "f", "d", "s", "d", "b", "f", "g"]

const str = "魔道祖师 so nice";
const reg = /[\u4e00-\u9fa5]/g;
console.log(str.match(reg)); // ["魔", "道", "祖", "师"]
// replace()
const str = "魔道祖师有15集";
const reg = /\d+/g;
// replace()第二个参数字符串的写法
console.log(str.replace(reg, "十五")); // 魔道祖师有十五集
// replace()第二个参数函数的写法
console.log(str.replace(reg, function (){
  return "十五";
})); // 魔道祖师有十五集

const str = "A1B2C3A1B2";
const reg = /(A1)|(B2)/g;
console.log(str.replace(reg, function (){
  return "a1"; // 所有A1 B2的被替换成a1
})); // a1a1C3a1a1

// replace() 位置置换
const str = "伴她 小机器人 可乐";
const reg = /(伴她)\s(小机器人)\s(可乐)/
console.log(str.replace(reg, "$2 $3 $1")); // 小机器人 可乐 伴她
// $1代表第一个子集,$2代表第二个子集,以此类推

const str = "A1B2C3";
const reg = /(A1)/g;
console.log(str.replace(reg, function(a,b,c,d){
  console.log(a); // 返回的是匹配成功的A1
  console.log(b); // 返回的是子集里面的A1
  console.log(c); // 下标
  console.log(d); // 源字符串
})); // A1  A1  0  A1B2C3

const str = "aaabbbcccdddeeefff";
const reg = /(\w)\1+/g;
// 贪婪匹配从最高次数匹配,子集转义\w匹配到小写字母,后面\1是转义前面的\w转义内容重复就累加在后面
console.log(str.match(reg));//["aaa", "bbb", "ccc", "ddd", "eee", "fff"]
const str = "abc";
const reg = /\w/g;
console.log(reg.exec(str)); // ["a", index: 0, input: "abc", groups: undefined]
console.log(reg.exec(str)); // ["b", index: 1, input: "abc", groups: undefined]
console.log(reg.exec(str)); // ["c", index: 2, input: "abc", groups: undefined]
console.log(reg.exec(str)); // null
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容