ES2018 新特性之:正则表达式 dotAll 形式

ES2018 新特征

“正则表达式的 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) (\n) – 换行
  • U+000D CARRIAGE RETURN (CR) (\r) – 回车
  • 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('\n');       // false
regex.test('\r');       // 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\nbar');     // false
/foo[^]bar/.test('foo\nbar');   // true

或许运用 \s 来婚配空缺字符:

/foo.bar/.test('foo\nbar');     // false
/foo[\s]bar/.test('foo\nbar');   // true

2. 增添 s/dotAll 标志

在最新的 ECMAScript 范例中,为 JavaScript 的正则表达式增添了一个新的标志 s 用来示意 dotAll。以使 . 能够婚配恣意字符。

/foo.bar/s.test('foo\nbar');    // true

High-level API

const re = /foo.bar/s;  //  等价于 const re = new RegExp('foo.bar', 's');
re.test('foo\nbar');    // 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\njava\n');   // false
/^java/m.test('just\njava\n');  // true
  • m 标志只影响 ^$
  • s 标志只影响 .

现在在 JavaScript 正则示意中所有修饰符的寄义:

  • g → global
  • i → ignoreCase
  • m → multiline
  • y → sticky
  • u → unicode
  • s → dotAll

4. 完成

    原文作者:justjavac
    原文地址: https://segmentfault.com/a/1190000013544567
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞