前言:提起正则,做深度学习的朋友可能会首先想到防止参数过拟合的 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入门[1]的笔记。阅读原文可以观看其视频。 强烈安利这位技术UP。
基础内容
对于字符串abc
,我们输入正则表达式:
•abc,可以匹配到出现在任意位置的abc•^abc, 全匹配 ,^a表示这个字符串开头必须是a,c表示这个字符串结尾必须是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}
其他符号
如.
表示除了 回车 的任意符号, 除了 回车/换行符号 line terminators 。
符号 . 匹配到两个字符串,被换行隔开
而 d
与 [0-9]
同, D
与 [^0-9]
同。我们一般用 [dD]
表示任意字符, 包括 回车/换行符号 line terminators 。
符号 [dD] 匹配到一个字符串,不会受换行影响
w
是常用互联网命名符号,与 [a-zA-Z0-9_]
同。
s
是特殊符号,与 [rntfv ]
同,S
是非特殊符号 [^rntfv ]
。
此外,还有表示数量的符号:
•w?
同 {0,1}
•w*
同 {0,}
•w
同 {1,}
举例:匹配 qq 邮箱
以我的邮箱 piperliu@qq.com
为例:
•^[a-zA-Z0-9]w*
第一个字符不能是下划线•后面是@qq.com$
,其中,.
表示字符“.
”,是转义符号。
用 JavaScript 匹配:
代码语言: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个组。
但是组`([a-zA-Z0-9]w*)`并不在 JavaScript 对象的组对象 groups 中
如上,在 JavaScript 对象的组对象 groups 中,并没有我们刚刚定义的组。这是因为 groups 中只存放定义了名称的组。我们用 ?<name>
定义组的名称。
'piperliu@qq.com'.match(/^(?<first>[a-zA-Z0-9]w*)@qq.com$/)
组`([a-zA-Z0-9]w*)`在 JavaScript 对象的组对象 groups 中
如上,我们定义组名称为first
。
组实现引用
在同一个正则表达式中,我们可以直接用索引引用组(1
),也可以用名字引用定义了组名的组(k<name>
)。
组的索引是从 1 开始的,而非 0 , 因为