正则表达式

含义

正则表达式是构成搜索模式的字符序列。

每个语言都有正则表达式。

正则表达式的作用:匹配特殊字符或有特殊搭配原则的字符的最佳选择。

字符

1.\ 转义字符

强制性把 \ 后面的字符转换成文本。

<script>
    var str = "cncnn\"aaaaa";
    console.log(str); // "cncnn"aaaaa"

    var str = "cncnn\\aaaaa";
    console.log(str); // cncnn\aaaaa
</script>



// 多行字符串代码
<script>
    document.body.innerHTML = "\
        <div></div>\
        <span></span>\
    ";

    document.body.innerHTML = 
        "<div></div>" +
        "<span></span>";
</script>

2.\n 字符串换行符

<script>
    var str = "avd\nddd";
    console.log(str);  //  avd
                    //  ddd
</script>

3.\r 行节数

4. \t 表示缩进(制表符)

正则表达式修饰符

  • i:执行对大小写不敏感的匹配。
<script>
    // 检测str里面有没有连着的abce字符串片段
    var reg = /abce/i;
    var str = "ABce";
    console.log(reg.test(str)); // true
</script>
  • g:执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
<script>
    // 检测str里面有没有ab字符串片段,并且返回全部
    var reg = /ab/g;
    var str = "abCDabABabF";
    console.log(str.match(reg));  // ["ab", "ab", "ab"]
</script>
  • m:执行多行匹配。
<script>
    // 检测str里面有没有以a字符串开头片段
    var reg = /^a/gm;
    var str = "abababab\nababab";
    console.log(str.match(reg));  // ["a", "a"]
</script>

正则表达式的方法

1.reg.test(); 用于检测一个字符串是否匹配某个模式。

<script>
    // 检测str里面有没有连着的abce字符串片段
    var reg = /abce/i;
    var str = "ABce";
    console.log(reg.test(str)); // true
</script>

2.str.match(); 在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。

<script>
    // 检测str里面有没有以a字符串开头片段
    var reg = /^a/gm;
    var str = "abababab\nababab";
    console.log(str.match(reg));  // ["a", "a"]
</script>

3.exec() 方法检索字符串中的指定值。返回值是被找到的值,并确定其位置。如果没有发现匹配,则返回 null。

不加属性g ,reg.exec就不会动。

<script>
    // 第一个参数写规则,还可以放写好的规则,第二个写属性。
    var reg = new RegExp("abic", "i"); 
    console.log(reg.exec("a")); // null
    console.log(reg.exec("abiCaaaa")); // ["abiC", index: 0, input: "abiCaaaa", groups: undefined]
</script>


<script>
    var reg = /(\w)\1\1\1/g;
    var str = "aaaa";
    console.log(str.match(reg)); // ["aaaa"]

    var reg = /(\w)\1(\w)\2/g;
    var str = "aacc";
    console.log(str.match(reg)); // ["aacc"]

    console.log(reg.exec(str)); // ["aacc", "a", "c", index: 0, input: "aacc", groups: undefined]
</script>

4. replace() 替换与正则表达式匹配的子串。

<script>
    var reg = /a/g;
    var str = "aa";
    console.log(str.replace(reg,"b")); // bb

    var reg = /(\w)\1(\w)\2/g;
    var str = "aabb";
    console.log(str.replace(reg,"$2$2$1$1")); // bbaa

    var reg = /(\w)\1(\w)\2/g;
    var str = "aabb";
    console.log(str.replace(reg,function ($, $1, $2) {
        return $2 + $2 + $1 + $1;
    })); // bbaa

    // 变大写
    var str = "aabb";
    console.log(str.toUpperCase(str)); // AABB

    // 变小写
    var str = "AABB";
    console.log(str.toLowerCase()); // aabb
</script>

把第一个替换成哪个。有g就全局匹配。

正向预查,正向断言?= ?!

<script>
    // 选择后面跟着b的a
    var str = "abaaaa";
    var reg = /a(?=b)/g;
    console.log(str.match(reg)); // ["a"]

    // 选择后面不是跟着b的a
    var str = "abaaaa";
    var reg = /a(?!b)/g;
    console.log(str.match(reg)); // ["a", "a", "a", "a"]
</script>

5. compile() 方法用于改变 RegExp。既可以改变检索模式,也可以添加或删除第二个参数。

<script>
    // 第一个参数写规则,还可以放写好的规则,第二个写属性。
    var reg = new RegExp("abic", "i"); 
    console.log(reg.test("a")); // false
    reg.compile("d");
    console.log(reg.test("abiCaadaa")); // true
</script>

6. reg.lastIndex (油标,可以手动控制) 与 reg.exec 相匹配。

lastIndex 属性用于规定下次匹配的起始位置。

上次匹配的结果是由方法 RegExp.exec() 和 RegExp.test() 找到的,它们都以 lastIndex 属性所指的位置作为下次检索的起始点。这样,就可以通过反复调用这两个方法来遍历一个字符串中的所有匹配文本。

正则表达式的创建方式

1.直接量 (推荐)

<script>
    // 检测str里面有没有连着的abc字符串片段
    var reg = /abc/;
    var str = "abcd";
    console.log(reg.test(str)); // true


    // 检测str里面有没有连着的abce字符串片段
    var reg = /abce/;
    var str = "abcd";
    console.log(reg.test(str)); // false
</script>

2.new RegExp();

<script>
    // 第一个参数写规则,还可以放写好的规则,第二个写属性。
    var reg = new RegExp("abic"); 
    console.log(reg.test("a")); // false
    console.log(reg.test("abicaaaa")); // true
</script>

正则表达式模式

表达式

1.[abc] 查找方括号之间的任何字符。

<script>
    var reg = /[abc][abc][abc]/g;
    var str = "12333abcafa3333babCa1a222ba3";
    console.log(str.match(reg)); //  ["abc", "bab"]
</script>
  • [a-z] 查找任何从小写 a 到小写 z 的字符。
<script>
    var reg = /[a-z][a-z]/g;
    var str = "12333aABcaab";
    console.log(str.match(reg)); //  ["ca", "ab"]
</script>
  • [A-Z] 查找任何从大写 A 到大写 Z 的字符。
<script>
    var reg = /[A-Z][A-Z]/g;
    var str = "12333aABcaab";
    console.log(str.match(reg)); //  ["AB"]
</script>
  • [A-z] 查找任何从大写 A 到小写 z 的字符。
<script>
    var reg = /[A-z][A-z]/g;
    var str = "12333aABcaab";
    console.log(str.match(reg)); //  ["aA", "Bc", "aa"]
</script>
  • [^abc] 查找任何不在方括号之间的字符。
<script>
    var reg = /[^abc][^abc]/g;
    var str = "12333aABcaab";
    console.log(str.match(reg)); //  ["12", "33", "AB"]
</script>

2.[0-9] 查找任何从 0 至 9 的数字。

<script>
    var reg = /[1234567890][1234567890][1234567890]/g;
    var str = "12333abcafa3333babCa1a222ba3";
    console.log(str.match(reg)); //  ["123", "333", "222"]

    var reg = /[0-9][0-9][0-9]/g;
    var str = "12333abcafa3333babCa1a222ba3";
    console.log(str.match(reg)); // ["123", "333", "222"]
</script>

3.(x|y) 查找由 | 分隔的任何选项。

<script>
    // 对任何指定的备选项进行全局搜索(AB|ab)
    var reg = /(AB|ab)/g;
    var str = "12333aABcaab";
    console.log(str.match(reg)); //  ["AB", "ab"]
</script>

元字符(是拥有特殊含义的字符)

1.\d 查找数字。

<script>
    // 匹配 [0-9]2a
    var reg = /\d2a/g;
    var str = "122a3332a";
    console.log(str.match(reg)); // ["22a", "32a"]
</script>
  • \D 查找非数字字符
<script>
    // 匹配 (非[0-9])2a
    var reg = /\D2a/g;
    var str = "122a333A2a";
    console.log(str.match(reg)); // ["A2a"]
</script>

2.\s 查找空白字符。空格符 制表符\t 回车符\r 换行符\n 垂直换行符\v 换页符\f

<script>
    // 匹配 (空白字符)2a
    var reg = /\s2a/g;
    var str = "122\na33\v3A\n2a";
    console.log(str.match(reg)); // ["↵2a"]
</script>
  • \S 查找非空白字符。
<script>
    // 匹配 (非空白字符)2a
    var reg = /\S2a/g;
    var str = "122a33\v3A\n2a";
    console.log(str.match(reg)); // ["22a"]
</script>

3.\b 匹配单词边界。

<script>
    // 单词的开头或结尾处对“2a”进行全局搜索。
    var reg = /\b2a/g;
    var str = "2a122a32a 2a3\v3A\n2a";
    console.log(str.match(reg)); // ["2a", "2a", "2a"]
</script>
  • \B 匹配非单词边界。
<script>
    // 单词的非开头或结尾处,对“2a”进行全局搜索。
    var reg = /\B2a/g;
    var str = "122a32a 2a3\v3A\n";
    console.log(str.match(reg)); // ["2a", "2a"]
</script>

4.\w 查找单词字符。[0-9A-z_]

<script>
    // 对“[0-9A-z_]2a”进行全局搜索。
    var reg = /\w2a/g;
    var str = "12_2a32a 2a3\v3A\n2a";
    console.log(str.match(reg)); // ["_2a", "32a"]
</script>
  • \W 查找非单词字符。
<script>
    // 对“(非[0-9A-z_])2a”进行全局搜索。
    var reg = /\W2a/g;
    var str = "12_2a32a 2a3\v3A\n2a";
    console.log(str.match(reg)); // [" 2a", "↵2a"]
</script>

5.\uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。

<script>
    // 全局搜索字符串中的十六进制数0057(W)。
    var reg = /\u0057/g;
    var str = "12_2a3wW2a W2a3\v3A\n2a";
    console.log(str.match(reg)); // ["W", "W"]
</script>

6. .查找单个字符,除了换行和行结束符。[^\n\r]

<script>
    // 全局搜索字符串中的"[^\n\r]2a"。
    var reg = /.2a/g;
    var str = "12_2a3wW2a W2a3\v3A\n2a";
    console.log(str.match(reg)); // ["_2a", "W2a", "W2a"]
</script>

量词

1.n+ 匹配任何包含至少一个 n 的字符串。

<script>
    // 匹配任何包含至少一个 A 的字符串。
    var reg = /A+/g;
    var str = "12_2a3wW2a W2a3\v3A\n2a AA";
    console.log(str.match(reg)); // ["A", "AA"]
</script>

2. n* 匹配任何包含零个或多个 n 的字符串。

<script>
    // 匹配任何包含零个或多个 A 的字符串。
    var reg = /A*/g;
    var str = " A\n 2a AA";
    console.log(str.match(reg)); // (9) ["", "A", "", "", "", "", "", "AA", ""]
</script>

3. n? 匹配任何包含零个或一个 n 的字符串。

<script>
    // 匹配任何包含零个或一个 A 的字符串。
    var reg = /A?/g;
    var str = " A\n 2a AA";
    console.log(str.match(reg)); // (10) ["", "A", "", "", "", "", "", "A", "A", ""]
</script>

4. n{X} 匹配 X 个序列的n字符串。

<script>
    // 匹配 3 个序列的A字符串。
    var reg = /A{3}/g;
    var str = " AAA\n 2a AAAA";
    console.log(str.match(reg)); //  ["AAA", "AAA"]
</script>

5. n{X,Y} 匹配 X 至 Y 个序列的n字符串。

<script>
    // 匹配 3 至 5 个序列的 A 字符串。
    var reg = /A{3,5}/g;
    var str = " AAA\n AAAAAA 2a AAAA";
    console.log(str.match(reg)); //  ["AAA", "AAAAA", "AAAA"]
</script>

6. n{X,} 匹配至少 X 个序列的n字符串。

<script>
    // 匹配至少 3 个序列的 A 字符串。
    var reg = /A{3,}/g;
    var str = " AAA\n AAAAAA 2a AAAA";
    console.log(str.match(reg)); //  ["AAA", "AAAAAA", "AAAA"]
</script>

7. n$ 匹配结尾n字符串。

<script>
    // 匹配结尾为 A 字符串。
    var reg = /A$/g;
    var str = " AAA\n AAAAAA 2a AAAA";
    console.log(str.match(reg)); //  ["A"]
</script>

8. ^n 匹配开头n字符串。

<script>
    // 匹配开头为 A 字符串。
    var reg = /^A/g;
    var str = "AAA\n AAAAAA 2a AAAA";
    console.log(str.match(reg)); //  ["A"]
</script>

练习

  1. 写一个正则表达式,检验一个字符串首尾(首或尾)是否含有数字。
<script>
    // 写一个正则表达式,检验一个字符串首尾是否含有数字。
    var reg = /^\d|\d$/g;
    var str = "123AAA\n AAAAAA 2a AAAA 333";
    console.log(str.match(reg)); // ["1", "3"]
</script>
  1. 练习:打后面往前查,每三个打一个点。
<script>
    // 练习:打后面往前查,每三个打一个点。
    var reg = /(?=(\B)(\d{3})+$)/g;
    var str = "100000";
    console.log(str.replace(reg, ".")); // ["1", "3"]
</script>
  1. the-first-name 变成小驼峰式
<script>
    var reg = /-(\w)/g;
    var str = "the-first-name";
    console.log(str.replace(reg,function ($, $1) {
        return $1.toUpperCase();
    })); // theFirstName
</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容