正则表达式笔记

正则表达式

正则表达式,又称规则表达式。(英语: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次

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容

  • python re模块重要函数变量:1. compile() 根据正则表达式字符串,创建模式的对象。2. sear...
    野狗子嗷嗷嗷阅读 298评论 0 1
  • JavaScript正则表达式笔记 概述 RegularExpression:安装某种规则匹配指定内容的单个字符串...
    hiccphp阅读 363评论 0 4
  • 正则详细文章 代码之美,正则之道 创建正则表达式 1. 使用一个正则表达式字面量 2. 调用RegExp对象的构造...
    Wood_yang阅读 496评论 0 0
  • 正则表达式代表的匹配字符[0-9]0123456789任意之一[a-z]小写字母任意之一[A-Z]大写字母任意之一...
    隐墨留白阅读 468评论 0 0
  • 《开学第一课》终于开播了。今年的主题为创造向未来,由此也引发了我的深息。无论是"京剧小达人"王泓翔穭虚拟歌于"犀"...
    王添祥阅读 191评论 0 2