美文网首页JavaScript
[ES] Regexp flags: gimsuy

[ES] Regexp flags: gimsuy

作者: 何幻 | 来源:发表于2018-01-02 11:04 被阅读15次

1. 背景

正则表达式是用于匹配字符串中字符组合的模式。
它使用一个模式字符串,来描述一系列匹配该句法规则的字符串集合。

在JavaScript中,正则表达式也是对象。
这些模式被用于RegExpexectest方法,
以及Stringmatchreplacesearchsplit方法。

正则表达式对象,有一个flags属性,
可用于表示字符串匹配的搜索方式,例如,进行全局或不区分大小写进行搜索。
这些参数既可以单独使用也可以一起使用。

2. 语法

/pattern/flags
new RegExp(pattern[, flags])
RegExp(pattern[, flags])

其中,pattern为模式字符串,
flags表示匹配方式。

3. flags

3.1 g

全局匹配,
找到所有匹配,而不是只找到第一个匹配。

r1 = /\d+/;
r1.exec('123-456');    // ['123']
r1.lastIndex    // 0 每次都从第0个字符开始搜索

r2 = /\d+/g;
r2.exec('123-456');    // ['123']
r2.lastIndex    // 3 从第3个字符开始搜索
r2.exec('123-456');    // ['456']
r2.lastIndex    // 7 从第7个字符开始搜索
r2.exec('123-456');    // null
r2.lastIndex    // 0 从第0个字符开始搜索

注:
(1)regexp.exec会返回一个数组,
第一个元素是匹配到的字符串,后面元素是各捕获组捕获到的字符串。
(2)可以手动设置regexp.lastIndex
让正则表达式从某个位置开始进行匹配。

3.2 i

忽略大小写

/[a-z]+/.exec('abcEDF');    // ['abc']
/[a-z]+/i.exec('abcEDF');    // ['abcDEF']

3.3 m

多行模式,
在多行模式下,^$将匹配每行的开头和结尾,而不是整个字符串的开始和结束。
每行通过\n\r分隔。

/^\d+$/.test('abc\n123');    // false
/^\d+$/m.test('abc\n123');    // true

3.4 s

s标志是TC 39的一个Stage 4提案,已准备纳入到ES 2018规范中了(finished-proposals)。
在之前版本的JavaScript中,.是不能匹配line terminators的,

/./.test('\n');    // false

// 替代方案
/[\s\S]/.test('\n');    // true
/[^]/.test('\n');    // true

增加s标志的动机,就是修复这个问题,
.可以匹配所有字符,包括line terminators

/./s.test('\n');    // true

3.5 u

unicode模式,
这是ES 2016引入的flags
让我们可以在正则表达式中使用unicode code point escapes

/\u{21}/u.test('!');    // true
/\u{21}/.test('uuuuuuuuuuuuuuuuuuuuu');    // true

注:
(1)不使用u标志,/\u{21}/也是合法的,将被解释为/u{21}/
它可用于匹配21u字符。

(2)不使用u标志,.可以匹配所有除line terminators之外的,所有BMP字符(Basic Multilingual Plane),
使用了u标志,则.可以匹配除line terminators之外的,所有的astral字符(astral planes)。

/a.b/.test('a𝌆b');    // false
/a.b/u.test('a𝌆b');    // true

3.6 y

sticky模式,
仅根据regexp.lastIndex的值进行匹配,
成功后更新regexp.lastIndex的值,失败后将regexp.lastIndex的值置为0

r1 = /\d+/;
r1.exec('123-456');    // ['123']
r1.lastIndex    // 0

r2 = /\d+/y;
r2.exec('123-456');    // ['123']
r2.lastIndex    // 3 更新lastIndex的值

// r2.lastIndex === 3时,无法匹配
r2.exec('123-456');    // null
r2.lastIndex    // 0 匹配失败

// 设置r2.lastIndex = 4,则可以匹配
r2.lastIndex = 4;
r2.exec('123-456');    // ['456']
r2.lastIndex    // 7 更新lastIndex的值

参考

MDN: RegExp
tc39 proposal: proposal-regexp-dotall-flag
Unicode-aware regular expressions in ECMAScript 6
New regular expression features in ECMAScript 6

相关文章

  • [ES] Regexp flags: gimsuy

    1. 背景 正则表达式是用于匹配字符串中字符组合的模式。它使用一个模式字符串,来描述一系列匹配该句法规则的字符串集...

  • String 对象之 replace方法

    一、基本语法: replace(regexp|substr, newSubStr|function[, flags...

  • ES6对正则做了哪些扩展?

    1、ES6 RegExp 构造函数表示形式在ES5 中,RegExp构造函数的参数有两种表示方式: 在ES6中,第...

  • ES6-正则

    在es6中可以使用' let regexp=new RegExp( /xyz/ig ,' i ' ); '的形式,...

  • ES9(四) —— RegExp-dotAll...

    RegExp RegExp 在ES9中新增 dotAll(点匹配)判断有没有开启dotAll named capt...

  • JavaScript正则表达式

    创建 js里创建正则对象有两种方法 字面量/pattren/flags 构造函数 new RegExp(pattr...

  • JavaScript - 正则表达式(一)

    一. 创建正则表达式 使用构造函数的方式new RegExp(pattern, flags) 使用字面量let r...

  • 5.正则的扩展(学习笔记)

    所有内容基于阮一峰的ECMAScript 6 入门 1.RegExp构造函数 ES6中如果RegExp构造函数第一...

  • 2020-03-19 正则的扩展

    一.RegExp(regular expression 正则表达式) 构造函数 语法 ES5的两种声明方式 ES6...

  • 正则扩展

    RegExp 构造函数 在 ES5 中,RegExp构造函数的参数有两种情况。 第一种情况是,参数是字符串,这时第...

网友评论

    本文标题:[ES] Regexp flags: gimsuy

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