在 ES9 中,正则表达式语法有了一些新的变化,其中最重要的是实现了非捕获组的与分组捕获并存方法。这个新特性可以让我们更方便地进行正则表达式匹配,并且可以提高代码的可读性和可维护性。
什么是非捕获组?
在正则表达式中,我们可以使用括号来分组匹配,这个括号就是捕获组。捕获组可以让我们在匹配的时候获取到括号内的内容,并且可以在后续的操作中使用。但是有时候我们并不需要获取这个括号内的内容,这个时候就可以使用非捕获组。
非捕获组的语法是 (?:)
,其中 ?:
表示这个括号内的内容不会被捕获。这个非捕获组可以用来进行分组匹配,但是不会对匹配结果产生影响。
什么是分组捕获并存?
分组捕获并存是指在匹配结果中同时获取到多个括号内的内容。在 ES9 中,我们可以使用 (?<name>)
的语法来给捕获组命名,然后在匹配结果中获取到这个命名的捕获组。这样可以让我们更方便地对匹配结果进行操作。
如何使用非捕获组的与分组捕获并存方法?
在 ES9 中,我们可以使用非捕获组的语法 (?:)
来进行分组匹配。例如,我们要匹配一个字符串中所有以 http
或 https
开头的 URL,但是不需要获取这个 URL 的协议部分。我们可以使用如下的正则表达式:
/(?:https?:\/\/)(\S+)/g
其中,(?:https?:\/\/)
表示匹配以 http
或 https
开头的 URL,但是不会捕获这个部分。(\S+)
表示匹配 URL 的剩余部分,并且将这个部分捕获到第一个捕获组中。
如果我们要同时获取 URL 的协议部分和剩余部分,可以使用分组捕获并存的语法 (?<name>)
。例如,我们要将一个字符串中的所有 URL 分别存储到 protocol
和 url
两个变量中,可以使用如下的正则表达式:
/(?<protocol>https?:\/\/)(?<url>\S+)/g
其中,(?<protocol>https?:\/\/)
表示匹配 URL 的协议部分,并且将这个部分捕获到 protocol
这个命名的捕获组中。(?<url>\S+)
表示匹配 URL 的剩余部分,并且将这个部分捕获到 url
这个命名的捕获组中。
总结
ES9 中实现了非捕获组的与分组捕获并存方法,可以让我们更方便地进行正则表达式匹配,并且可以提高代码的可读性和可维护性。在使用非捕获组的语法 (?:)
和分组捕获并存的语法 (?<name>)
的时候,需要注意语法的正确使用和命名的合理性,这样可以让我们更方便地对匹配结果进行操作。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/655c62ecd2f5e1655d67d47f