美文网首页
正则表达式笔记

正则表达式笔记

作者: 一刀一个小黄鱼 | 来源:发表于2017-10-08 00:48 被阅读12次

正则表达式

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。正则并不是js所独有的,他是独立与任何语言之外的,很多的编程语言都支持使用正则规则对字符串进行一些复杂的操作。

正则在js中是以对象的形式存在的,和日期对象,数组对象类似

创建正则对象的方式

  1. 传统: new RegExp()
  2. 简写: //
var re1 = new RegExp('a'); //参数接收字符串,字符串:正则规则的内容
console.log(re1); /a/

var re2 = /a/;
console.log(re2); /a/

var re3 = /\d/;
console.log(re3); /\d/

*//如果使用传统的方式来创建一个正则对象,那么字符串会被默认先进行解析,然后把解析后的字符串作为参数传给正则对象
var re4 = new RegExp('\d')
console.log(re4); /d/
*//首先\d会被字符串解析成字符d,然后在把解析后的d作为参数;

var re5 = new RegExp('\\d');
console.log(re5); /\d/

var usename = 'zzaall';
*// 如果我们通过简写的形式,那么 // 中的字符是不会被js作为特殊数据解析的,比如变量,如果我们的正则中有通过变量来表示的内容,那么简写的方式就不适合了
var re6 = /usename/;
console.log(re6); /usename/

var re7 = new RegExp(username)
console.log(re7); /zzaall/
正则.test(字符串)

检测参数字符串中是否包含有正则对象所匹配的内容,如果有返回true,如果没有就返回false

console.log(/\d/.test('abc1degfg')) //true

\d: 一个数字


字符串.search(字符串/正则)

查找参数的内容在前面字符串中首次出现的位置,如果没有返回-1.和indexOf很类似,但是他和indexOf有一个最大的区别是:indexOf参数只支持字符串,search还可以支持正则

console.log('abcde'.search('a')); 0
console.log('abcde'.search('b')); 1 

console.log('abcde'.search(/a/)); 0
console.log('a2bcde'.search(/\d/)); 1

console.log('bacds'.search(/A/i)); 1
console.log('bacds'.search( new RegExp('A', 'i') )); 1

i: ignore 忽略 大小写

修饰符: 对正则表达式内容的强调与说明


字符串.match(正则)

在前面的字符串中查找和参数匹配的内容,并保存到一个数组中返回

var str = 'j234hj2g42jh4j2k1';
console.log( str.match(/\d/) ); // 2 一个数组,保存第一个数字出现
console.log( str.match(/\d/g) );// 2,3,4,2,4,2,4,2,1所有数字的数组

模式:

  • 懒惰: 如果使用懒惰模式进行内容匹配,那么当找到一个匹配结果的时候,就终止继续执行
  • 非懒惰: g : global 全局查找,修饰符
var str = 'j234hj2g42jh4j2k1';
console.log( str.match(/\d+/g) ); //234,2,42,4,2,1 

+: 表示+的前一个规则最少匹配一次,最多不限,量词

模式:贪婪:当一组结果中的内容有多个满足的时候,正则会选择最大化的结果作为最终结果


字符串.replace(要查找的内容, 要替换的内容)

在前面的字符串中查找第一个参数指定的内容,并用第二个参数的内容进行替换

console.log('asdasda'.replace('a','*')); //*sdasda

*/简单的字符串替换,只会替换一次,如果我们需要进行一些更为复杂的查找和替换,那么就需要使用正则来进行
console.log( 'asdasda'.replace(/a/gi, '*') ); //*sd*sd

replace

  • 第一个参数:既可以接收普通的字符串,也可以接收正则对象
  • 第二个参数:既可以接收普通的字符串,还可以接收一个函数(回调)
敏感词替换

//我们可以根据当前这次匹配的内容长度来动态的返回不同个数的*
var str = '西红柿是红色的';
var newStr = str.replace(/西红柿|红色/g,function(a){;
console.log(a); //西红柿 红色

var s = '';
for(var i = 0;i < a.lenfth;i++){
    s += '*'
}
return s;
});
console.log(newStr);
//***是**的
子项
var d1 = '2017-7-17';

function formatDate(str){
  return str.replace(/(\d+)\D+(\d+)\D+(\d+)/,function($0,$1,$2,$3){
    // 第一个参数($0):当前整个正则所匹配的内容,后面的参数是每个()里的内容
    console.log($0); //2017-7-17
    console.log($1); //2017
    console.log($2); //7
    console.log($3); //17
    return $1 + '年' + $2 + '月' + $3 + '日';
  })
}
console.log(formatDate(d1));

\D: 一个非数字

(): 子项; 范围(提权),会在结果中保留(提供)子项当前匹配的内容

从左至右,从外至里 也可以 根据 ( 出现的顺序来

范围选择

    var str = 'a1ba2ba3baaba4b';

    //a开头b结尾中间是数字 (a数字b)
    console.log(str.replace(/a\db/g, '*'));   ***aab*

    //a开头b结尾中间是1或2或3
    console.log(str.replace(/a(1|2|3)b/g, '*'));  ***aaba4b

    // [] 中的值是被选值,匹配其中的一个
    console.log(str.replace(/a[123]b/g, '*')); ***aaba4b

    console.log(str.replace(/a[123456789]b/g, '*')); ***aab*
    console.log(str.replace(/a[1-9]b/g, '*')); ***aab*
    console.log(str.replace(/a[a-z]b/g, '*')); a1ba2ba3b*a4b
    console.log(str.replace(/a[A-Z]b/g, '*')); a1ba2ba3baaba4b
    console.log(str.replace(/a[a-zA-Z]b/g, '*')); a1ba2ba3b*a4b

    // 匹配的是1-5或7
    console.log(str.replace(/a[1-57]b/g, '*')); ***aab*

    //问题:匹配1-57
    /[1-9]|[1-4]\d|5[0-7]/

反向选择 ^
var str = 'a1ba2ba3baaba4ba5ba6ba7b';
// ^ 在 [] 中使用,表示反向选择的意思,只能在 [] 的开始 ,除了1 2的
console.log(str.replace(/a[^12]b/g, '*'));  a1ba2b******
起始符和结束符

在正则中

^ : 字符串的起始; $ : 字符串的结尾

量词

  • {n} 只能n次
  • {n,} 最少n次,最多不限
  • {n,m} 最少n次,最多m次
检测qq号
var qq = '200824584'
console.log(/^[1-9]\d{4,11}$/.test(qq));  true
//第一位是1-9之间的数,后面数字在4到11位之间
常用正则符号
   \d : 一个数字
   \D : 一个非数字
   \w : 一个字符(字母数字下划线)
   \W : 一个非字符(字母数字下划线)
   \s : 一个空格
   \S : 一个非空格
   \b : 一个边界符,如果一个字母数字下划线的左侧或右侧不在是一个字母数字下划线,那么这里就会有一个符号:边界符
   \B : 一个非边界符
   
   . : 任意字符,除了换行符

重复子项
{n} : {n}表示的是一个数字 \1 \2 \3
//重复第n个子项匹配的内容
/(a)b\1/      // \1必须和第一个子项的内容是一致的
/(\d)a\1/    // \1位置上的内容必须和第一个子项的内容保持一致

var str = 'aaaaaabbbbbbjjjjjtttttttttttiiiidddd';
    var n = 0;
    var s = '';
    str.replace(/(\w)\1+/g, function($0, $1) {
        if ($0.length > n) {
            n = $0.length;
            s = $1;
        }
    });
    console.log('出现次数最多的是' + s + ',一共出现了' + n + '次');
    //出现次数最多的是t,一共出现了11次

相关文章

  • 学习笔记 正则表达式

    2021.01.19 北京海淀 -2℃ 小雪转晴 正则表达式学习笔记 说明:该笔记参考“菜鸟教程”网站正则表达式...

  • 笔记:正则表达式

    正则表达式基础部分笔记

  • js高级(四)

    JavaScript高级第04天笔记 1.正则表达式概述 1.1什么是正则表达式 正则表达式( Regular E...

  • 正则表达式学习笔记

    正则表达式学习笔记 一篇记录了学习正则表达式的笔记。 1. 转义字符 在 HTMl 中转义字符以 & 符号开头,分...

  • JavaScript正则表达式

    JavaScript 正则表达式 @(笔记)[正则表达式] 第一章 课程简介 1-1 JS正则表达式简介及应用 课...

  • Python学习随笔

    本笔记整理自中谷教育在线教育视频 学习笔记——正则表达式常用符号 这里学习过正则表达式后,简单做了一个爬虫程序,效...

  • 作业-第04周--课堂-Day15-正则表达式与三剑客知识应用实

    Day15 课堂笔记 1. 正则表达式 什么是正则表达式? 简单地说,正则表达式就是为了处理大量的字符串及文本而定...

  • 一个程序员的自我学习第一天

    《正则表达式必知必会》笔记 第一章:正则表达式入门 1:正则表达式是一些用来匹配和处理文本的字符串。正则...

  • Python ☞ day 11

    Python学习笔记之 正则表达式 re模块概述:Python自1.5以后增加了re的模块,提供了正则表达式模式...

  • Python3.5笔记——第11章 正则表达式

    Python3.5笔记 第11章 正则表达式 认识正则表达式 正则表达式是一个特殊字符序列,能够帮助用户检查一个字...

网友评论

      本文标题:正则表达式笔记

      本文链接:https://www.haomeiwen.com/subject/hqosyxtx.html