《正则表达式》

    [ 'python', 'javascript', 'jsonp' ]

    1. 正则表达式的使用
    2. js 中的正则表达式与 pcre( ) 的区别

    开始这门课之前,大家先去看两篇文章。

    《正则表达式30分钟入门教程》:http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html

    上面这篇介绍了正则表达式的基础知识,但是对于零宽断言没有展开来讲,零宽断言看下面这篇:

    《正则表达式之:零宽断言不『消费』》:

    好了。

    在很久很久以前,有一门语言一度是字符串处理领域的王者,叫 perl。

    伴随着 perl,有一个类似正则表达式的标准被实现了出来,叫 pcre:Perl Compatible Regular Expressions。

    如果需要测试你自己写的正则表达式,建议上这里:http://refiddle.com/ ,可以所见即所得地调试。

    接下来我们主要讲讲 js 中需要注意的地方,至于正则表达式的内容,上面那两篇文章足够学习了。

    第一,

    js 中,对于四种零宽断言,只支持 零宽度正预测先行断言 和 零宽度负预测先行断言 这两种。

    第二,

    js 中,正则表达式后面可以跟三个 flag,比如 /something/igm

    他们的意义分别是,

    • i 的意义是不区分大小写
    • g 的意义是,匹配多个
    • m 的意义是,是 ^$ 可以匹配一行的开头。

    分别举个例子:

    1. /a/.test('A') // => false
    2. /a/i.test('A') // => true
    3. 'hello hell hoo'.match(/h.*?\b/) // => [ 'hello', index: 0, input: 'hello hell hoo' ]
    4. 'hello hell hoo'.match(/h.*?\b/g) // => [ 'hello', 'hell', 'hoo' ]
    5. 'aaa\nbbb\nccc'.match(/^[\s\S]*?$/g) // => [ 'aaa\nbbb\nccc' ]
    6. 'aaa\nbbb\nccc'.match(/^[\s\S]*?$/gm) // => [ 'aaa', 'bbb', 'ccc' ]

    他们的意义分别是:

    在 js 中,g flag 会影响 String.prototype.match()RegExp.prototype.exec() 的行为

    String.prototype.match() 中,返回数据的格式会不一样,加 g 会返回数组,不加 g 则返回比较详细的信息

    1. > 'hello hell'.match(/h(.*?)\b/g)
    2. [ 'hello', 'hell' ]
    3. > 'hello hell'.match(/h(.*?)\b/)
    4. [ 'hello',
    5. 'ello',
    6. index: 0,
    7. input: 'hello hell' ]

    RegExp.prototype.exec() 中,加 g 之后,如果你的正则不是字面量的正则,而是存储在变量中的话,特么的这个变量就会变得有记忆!!

    第三,

    大家知道,. 是不可以匹配 \n 的。如果我们想匹配的数据涉及到了跨行,比如下面这样的。

    1. var multiline = require('multiline');
    2. var text = multiline.stripIndent(function () {
    3. head

    */
    });

    1. 如果我们想把两个 \`\`\` 中包含的内容取出来,应该怎么办?
    2. 直接用 `.` 匹配不到 `\n`,所以我们需要找到一个原子,能匹配包括 `\n` 在内的所有字符。
    3. 这个原子的惯用写法就是 `[\s\S]`
    4. ```js
    5. var match1 = text.match(/^```[\s\S]+?^```/gm);
    6. console.log(match1) // => [ '```\ncode code2 code3```\n```' ]
    7. // 这里有一种很骚的写法,[^] 与 [\s\S] 等价
    8. console.log(match2) // => [ '```\ncode code2 .code3```\n```' ]

    完。