关于javascript:正则表达式杂记入门笔记速查进阶组属性vim-magic-与练习场地

30次阅读

共计 2847 个字符,预计需要花费 8 分钟才能阅读完成。

前言:提起正则,做深度学习的敌人可能会首先想到避免参数过拟合的 L1/L2 正则算法。此正则非彼正则。正则表达式(Regular Expression, regex) 用于字符串匹配,规定明确、语法精简、利用场景极其宽泛。

简直所有写代码的敌人都或多或少接触过一点 regex,但你真的会用吗?比方,用于全匹配 aabc 的 regex 为 ^(?<a>.)\k<a>(?!\k<a>)(?<b>.)(?!\k(b)|\k<a>).$,你能够给出解释吗?明天,无妨一起回顾一下 regex 中的常识;此外,笔者将分享一些拓展内容,比方 vim 中的 magic、练习 regex 的绝佳在线工具等。

入门笔记速查

本段及下段内容是 B 站 UP 主 free-coder 视频正则表达式 - 从入门到 group 入门的笔记。浏览原文能够观看其视频。强烈安利这位技术 UP。

根底内容

对于字符串abc,咱们输出正则表达式:

  • abc,能够匹配到呈现在任意地位的abc
  • ^abc$全匹配 ^a 示意这个字符串结尾必须是 ac$ 示意这个字符串结尾必须是c

此外,咱们能够用 中括号 [] 某个范畴的匹配,比方:

  • [a-z]示意匹配任意地位的某个字符,这个字符的范畴是a,b,c,...,z
  • [a-zA-Z]示意匹配任意地位的某个字符,这个字符的范畴是a,b,c,...,z,A,B,C,...,Z

而在中括号 [] 内,^示意取反,如,^[^a-z]$示意:全匹配一个字符,这个字符不属于a,b,c,...,z

大括号 示意字符的数量,如:

  • ^[a-zA-Z]{3}$示意,全匹配一个字符串,这个字符串有 3 个字符,每个字符都属于a,b,c,...,z,A,B,C,...,Z
  • ^[a-zA-Z]{3,}$示意,全匹配一个字符串,这个字符串 至多 3 个字符,每个字符都属于a,b,c,...,z,A,B,C,...,Z
  • ^[a-zA-Z]{3,6}$示意,全匹配一个字符串,这个字符串 至多 3 个字符,至少 6 个字符,每个字符都属于a,b,c,...,z,A,B,C,...,Z

其余符号

. 示意除了 回车 的任意符号, 除了 回车 / 换行符号 line terminators。

\d[0-9] 同,\D[^0-9] 同。咱们个别用 [\d\D] 示意任意字符,包含 回车 / 换行符号 line terminators。

![符号 [dD] 匹配到一个字符串,不会受换行影响](https://gitee.com/piperliu/pi…

\w 是罕用互联网命名符号,与 [a-zA-Z0-9_] 同。

s 是特殊符号,与 [\r\n\t\f\v] 同,\S 是非特殊符号 [^\r\n\t\f\v]

此外,还有示意数量的符号:

  • w?{0,1}
  • w*{0,}
  • w+{1,}

举例:匹配 qq 邮箱

以我的邮箱 piperliu@qq.com 为例:

  • ^[a-zA-Z0-9]\w*第一个字符不能是下划线
  • 前面是 @qq\.com$,其中,\. 示意字符“.”,\是本义符号。

用 JavaScript 匹配:

'piperliu@qq.com'.match(/^[a-zA-Z0-9]\w*@qq\.com$/)

其中,字符串对象的 match() 函数中用 // 包裹正则表达式。

进阶:组属性

组属性很神奇,有了组属性,咱们能够表白更简单的语法规定。

组根底

咱们用括号 () 定义哪些局部是一个组。

'piperliu@qq.com'.match(/^([a-zA-Z0-9]\w*)@qq\.com$/)

其中,咱们将 piperliu([a-zA-Z0-9]\w*)定义为一个组,且是第 1 个组。

如上,在 JavaScript 对象的组对象 groups 中,并没有咱们刚刚定义的组。这是因为 groups 中只寄存定义了名称的组。咱们用 ?<name> 定义组的名称。

'piperliu@qq.com'.match(/^(?<first>[a-zA-Z0-9]\w*)@qq\.com$/)

如上,咱们定义组名称为first

组实现援用

在同一个正则表达式中,咱们能够间接用索引援用组(\1),也能够用名字援用定义了组名的组(\k<name>)。

组的索引是从 1 开始的,而非 0,因为 \0 曾经被用来示意 asc 码的第一个码。

对于字符串1212,咱们能够用如下的形式匹配:

  • ^\d\d\d\d$
  • ^(\d\d)\1$,援用第一组
  • ^?<first>(\d\d)\k<first>$,间接用了组名

组的非凡构造

有了组,咱们能够实现很多 Group Construction,首先以 Positive Lookahead 为例。

对于字符串 foobar,fooboo 为例,咱们想找出 foo,且这个foo 必须紧紧靠在 bar 前,则可表白如下:

  • foo(?=bar)

再举个例子,Positive LookbehindNegative Lookbehind,对于字符串barfoo,boofoo,咱们想找出foo

  • 这个 foo 必须紧紧靠在 bar 后,则(?<=bar)foo
  • 这个 foo 前紧邻的必须不是bar,则(?!=bar)foo

老师例题

当初想匹配字符串模式aabc,要留神不能够匹配到:

  • aaaa
  • aabb
  • aaba

则正则表达式如下:

^(?<a>.)\k<a>(?!\k<a>)(?<b>.)(?!\k<b>|\k<a>).$

剖析一下:

  • ^(?<a>.)第一个字符,定义为组a,能够是任何字符.
  • \k<a>第二个字符要与第一个字符同
  • (?!\k<a>)此外,第二个字符紧前面的字符,不能够是组 a 的字符
  • (?<b>.)第三个字符定义为组b
  • (?!\k<b>|\k<a>)此外,第二个字符紧前面的字符,不能够是组 b 或组 a 的字符
  • .第四个字符任意

vim magic

在上古神器 vim 中,我习惯 应用相似正则的思维,进行批量正文(其实是 VS Code 中 vim 插件,块快捷键 Ctrl+v 与粘贴键有抵触),如下图(编辑模式下:2,3s/^/#/g)。

而对于 vim 来讲,在应用 / 正则查找时,分为两个模式:

  • magic 模式
  • nomagic 模式

对于 magic 模式,咱们的特殊符号如 . 就是非凡含意(任何字符),即失常的正则表白模式;对于 nomagic 模式,咱们的符号都只表白符号自身,应用非凡含意须要用 \ 本义。

更多内容,如 vim 中的 very magic 等,能够参阅:
https://www.cnblogs.com/pense…

学习资源

https://regex101.com/

Online regex tester and debugger: PHP, PCRE, Python, Golang and JavaScript

如其英文名,极其牢靠的在线正则表达式调试工具,会集了性能包含:教学、查阅、解析与剖析、运算、常识检测等。

浏览原文:https://www.bilibili.com/vide…

感激你读到最初!我是小拍,一名计算机技术爱好者!感觉文章不错的话,能够点击“在看”反对我一下!有任何批评倡议或者单干事宜,能够给我发邮件 piperliu@qq.com,或者关注公众Piper 蛋窝,回复「微信」来加我微信分割~

正文完
 0