资讯专栏INFORMATION COLUMN

ES2018 新特征之:正则表达式 dotAll 模式

Joyven / 1905人阅读

摘要:或者使用来匹配空白字符增加标志在最新的规范中,为的正则表达式增加了一个新的标志用来表示。标志用于指定多行输入字符串应该被视为多个行。标志只影响和标志只影响目前在正则表示中所有修饰符的含义实现

ES2018 新特性

异步迭代器

正则表达式反向(lookbehind)断言

正则表达式 Unicode 转义

非转义序列的模板字符串

正则表达式 s/dotAll 模式(本文)

正则表达式命名捕获组

对象展开运算符

Promise.prototype.finally

“正则表达式的 s (dotAll) flag” 提案 proposal-regexp-dotall-flag 由 Mathias Bynens 负责,目前已经进入 stage 4,并将成为 ES9(ES2018) 的一部分。

1. 概述

在 JavaScript 正则表达式中 . 用来匹配任何单个字符。但是有 2 个例外:

1.1 多字节 emoji 字符
let regex = /^.$/;
regex.test("?");   // false

我们可以通过设置 u 标志来解决,u 的含义是 unicode:

let regex = /^.$/u;
regex.test("?");   // true
1.2 行终结符(line terminator characters)

行终结符包含:

U+000A LINE FEED (LF) ( ) - 换行

U+000D CARRIAGE RETURN (CR) ( ) - 回车

U+2028 LINE SEPARATOR - 行分隔符

U+2029 PARAGRAPH SEPARATOR - 段分隔符

还有一些其它字符,也可以作为一行的开始:

U+000B VERTICAL TAB (v)

U+000C FORM FEED (f)

U+0085 NEXT LINE

目前 JavaScript 正则表达式的 . 可以匹配其中的一部分:

let regex = /./;

regex.test("
");       // false
regex.test("
");       // false
regex.test("u{2028}"); // false
regex.test("u{2029}"); // false

regex.test("v");       // true
regex.test("f");       // true
regex.test("u{0085}"); // true

在正则表达式中,用于表示字符串开头和字符串结尾的元字符是 ^$, 因此一个变通的方式是使用 ^ 来匹配。

/foo.bar/.test("foo
bar");     // false
/foo[^]bar/.test("foo
bar");   // true

或者使用 s 来匹配空白字符:

/foo.bar/.test("foo
bar");     // false
/foo[s]bar/.test("foo
bar");   // true
2. 增加 s/dotAll 标志

在最新的 ECMAScript 规范中,为 JavaScript 的正则表达式增加了一个新的标志 s 用来表示 dotAll。以使 . 可以匹配任意字符。

/foo.bar/s.test("foo
bar");    // true

High-level API

const re = /foo.bar/s;  //  等价于 const re = new RegExp("foo.bar", "s");
re.test("foo
bar");    // true
re.dotAll;      // true
re.flags;       // "s"
3. 命名由来

既然是为了实现 dotAll 功能,为什么不命名为 d 或者 a。因为在其它语言的正则表达式实现中,已经使用 s 标志了:

Java 使用 Pattern.DOTALL

C# 和 VB 使用 RegexOptions.Singleline

Python 同时支持 re.DOTALLre.S

在支持正则表达式使用 flag 的语言如 Perl、PHP 也使用 s 作为标志。

s 的含义是 singleline 和 dotAll。

singleline(单行)对应的是 multiline(多行)。

m 标志用于指定多行输入字符串应该被视为多个行。如果使用 m 标志,^$ 匹配的开始或结束是字符串中的每一行,而不是整个字符串的开始或结束。

/^java/.test("just
java
");   // false
/^java/m.test("just
java
");  // true

m 标志只影响 ^$

s 标志只影响 .

目前在 JavaScript 正则表示中所有修饰符的含义:

g → global

i → ignoreCase

m → multiline

y → sticky

u → unicode

s → dotAll

4. 实现

V8 - Chrome 62

JavaScriptCore - Safari Technology Preview 39a

XS, shipping in Moddable as of the January 17, 2018 update

regexpu (transpiler) with the { dotAllFlag: true } option enabled

online demo

Babel plugin

Compat-transpiler of RegExp Tree

Babel plugin

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93190.html

相关文章

  • ES2018 特征:非转义序列的模板字符串

    摘要:新特性异步迭代器正则表达式反向断言正则表达式转义非转义序列的模板字符串本文正则表达式模式正则表达式命名捕获组对象展开运算符这个提案由负责,目前已经进入,本提案是的一部分。因此标准移除了对在带标签的模版字符串中转义序列的语法限制。 ES2018 新特性 异步迭代器 正则表达式反向(lookbehind)断言 正则表达式 Unicode 转义 非转义序列的模板字符串(本文) 正则表达式...

    stackfing 评论0 收藏0
  • ES2018 特征:异步迭代器 for-await-of

    摘要:不幸的是,迭代器不能用来表示这样的数据源。即使是的迭代器也是不够的,因为它的是异步的,但是迭代器需要同步确定状态。异步迭代器一个异步迭代器就像一个迭代器,除了它的方法返回一个的。 ES2018 新特性 异步迭代器(本文) 正则表达式反向(lookbehind)断言 正则表达式 Unicode 转义 非转义序列的模板字符串 正则表达式 s/dotAll 模式 正则表达式命名捕获组 对...

    klivitamJ 评论0 收藏0
  • ES6学习 第五章 正则的扩展

    摘要:前言本章介绍正则的扩展。属性属性表明正则表达式带有标志。行终止符所谓行终止符,就是该字符表示一行的终结。比如,只匹配不在美元符号后面的数字,要写成。前言本章介绍正则的扩展。有些不常用的知识了解即可。本章原文链接:正则的扩展RegExp 构造函数从 ES6 开始,如果RegExp构造函数第一个参数是一个正则对象,并且第二个标志存在且为标志参数,将不再抛出 TypeError ,将使用这些参数创...

    番茄西红柿 评论0 收藏2637

发表评论

0条评论

Joyven

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<