ECMAScript 2021 中的反向断言:如何使用 /(?<!pattern)/ 正则表达式

在 ECMAScript 2021 中,新增了反向断言语法。这个语法允许我们在正则表达式的内部向后检查,看看前面的文本是否符合某种模式。在这篇文章中,我们将讨论这项新功能的具体用法,以及如何在实际开发中使用它。

什么是反向断言?

在正则表达式中,断言主要用于匹配文本之前或之后的条件,但在 ECMAScript 2021 中,我们现在可以在正则表达式的内部使用断言。反向断言是指向后查找一个元素,看看前面的文本是否符合某种模式。通俗地说,就是从当前位置向前检查,看看前面的文本是否符合某种条件。

在 ECMAScript 2021 中,反向断言语法有三种:

  • /(?<!pattern)/:否定式反向断言,表示前面的文本不能匹配给定的 pattern。
  • /(\?<=pattern)/:肯定式反向断言,表示前面的文本必须匹配给定的 pattern。
  • /(\?<!pattern)/:否定式肯定断言,表示前面的文本必须匹配给定的 pattern。

否定式反向断言的使用

下面我们看一下如何使用否定式反向断言。否定式反向断言的语法是/(?<!pattern)/。它表示前面的文本不能被匹配给定的 pattern。例如,我们想要匹配字符串中所有不包含“www”的 URL,可以使用以下正则表达式:

----- ---- - -
  --------------------------
  ------------------------
  ----------------------
--

----- -- - --------------------------------

--- ------ --- -- ----- -
  ---------------------------
-

上面的代码输出:

- ----------------------- -
- --------------------- -
- --------------------- -

在上面的代码中,我们使用(?<!www)来表示 URLs 中不能包含“www”。正则表达式/(https?|ftp):\/\/\S+/g则表示匹配任何以 “http://”、“https://”或“ftp://”开头的 URL。使用否定式反向断言后,我们得到的结果就是不包含“www”的 URL。

利用反向断言优化代码

在实际开发中,反向断言可以用于优化代码。例如,我们有一个字符串数组,要求元素按照字符数从小到大排序,如果有相同长度的元素,则按照字典序进行排序。下面是一个方法,可以根据这个规则排序字符串数组:

-------- ---------------- -
  ------ ------------ -- -- -------- - -------- -- --------------------
-

----- --- - ------ -------- -------- ---------- ------ -----------

------------------------------ -- - ----- ------ -------- -------- ---------- --------- -

上面的代码中,我们使用了数组的sort()方法,按照字符串的长度进行排序,如果字符串长度相同,就使用字典序。如果字符串中有包含数字的元素,可能会导致程序出现错误。改进这个方法可以使用反向断言的特性:

-------- ---------------- -
  ------ ------------ -- --
    ------------------ --- --- ------------------ ---
      - ------------------
      - -------- - ---------
  --
-

----- --- - ------ -------- -------- ---------- ------ -----------

------------------------------ -- - ----- ------ -------- -------- ---------- --------- -

在上面的代码中,我们使用了replace()方法,将字符串中所有包含数字的元素替换为空字符串。使用反向断言后,a.replace(/^\d+$/, '') === b.replace(/^\d+$/, '')表示字符串长度相同,并且这两个字符串不包含任何数字。如果这两个条件都满足,则使用字典序进行排序。否则,就按照字符串的长度进行排序。

总结

在 ECMAScript 2021 中,反向断言是一项非常实用的功能,特别是在需要匹配长度相同的字符串时。本文介绍了反向断言的基本语法,并提供了一些实际用例和示例代码。如果你对正则表达式和 JavaScript 感兴趣,建议多尝试一些用例,加深对这个主题的理解。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/66568b19d3423812e4b5a168