ES2018 新特徵之:正則表達式 dotAll 模式

ES2018 新特性


「正則表達式的 s (dotAll) flag」 提案 proposal-regexp-dotall-flag 由 Mathias Bynens 負責,目前已經進入 stage 4,並將成爲 ES9(ES2018) 的一部分。html

1. 概述

在 JavaScript 正則表達式中 . 用來匹配任何單個字符。可是有 2 個例外:java

1.1 多字節 emoji 字符

let regex = /^.$/;
regex.test('?');   // false

咱們能夠經過設置 u 標誌來解決,u 的含義是 unicode:git

let regex = /^.$/u;
regex.test('?');   // true

1.2 行終結符(line terminator characters)

行終結符包含:github

  • U+000A LINE FEED (LF) (\n) - 換行
  • U+000D CARRIAGE RETURN (CR) (\r) - 回車
  • U+2028 LINE SEPARATOR - 行分隔符
  • U+2029 PARAGRAPH SEPARATOR - 段分隔符

還有一些其它字符,也能夠做爲一行的開始:web

  • 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

在正則表達式中,用於表示字符串開頭和字符串結尾的元字符是 ^$, 所以一個變通的方式是使用 ^ 來匹配。api

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

或者使用 \s 來匹配空白字符:babel

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

2. 增長 s/dotAll 標誌

在最新的 ECMAScript 規範中,爲 JavaScript 的正則表達式增長了一個新的標誌 s 用來表示 dotAll。以使 . 能夠匹配任意字符。app

/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. 實現

相關文章
相關標籤/搜索