淘先锋技术网

首页 1 2 3 4 5 6 7

正则表达式练习 - Github

阅读公众号看到一个练习正则表达式的 Github 项目,果断上去复习了一波,并重新记录一下相关知识。

正则表达式

"正则表达式" - 一组由字母和符号组成的特殊文本,可以用来从文本中找出满足你想要的格式的句子。

元字符

" . " - 句号匹配任意单个字符,除了换行符。

[] - 字符种类,匹配方括号内的任意字符。

[^] - 否定的字符种类,匹配除了方括号内的任意字符。

" * " - 匹配 >=0 个重复的,在 * 号之前的字符。

" + " - 匹配 >= 1 个重复的,在 + 号之前的字符。

" ? " - 标记 ? 之前的字符为可选的,匹配 1 或 0 个。

{n,m} - 匹配 [n,m] 个 大括号之前的字符

    a. {n,}
    b. {,m}
    
(xyz) - 字符集,匹配与 xyz 完全相等的字符串。

" | " - 与运算符

" \ " - 转移字符,用于匹配保留字。

" ^ " - 从开始行开始匹配

" & " - 从末端开始匹配

简写字符集

\w - 匹配所有字符(大小写)、数字,等同于 [a-zA-Z0-9_]

\W - 匹配所有非字母数字,等同于 [^\w]

\d - 匹配所有数字,[0-9]

\D - 匹配所有非数字,[^0-9]

\s - 匹配所有空格字符

\S - 匹配所有非空格字符,[^\s]

\f - 匹配一个换页符

\n - 匹配一个换行符

\r - 匹配一个回车符

\t - 匹配一个制表符

\v - 匹配一个垂直制表符

\p - 匹配 CR/LF(等同于 \r\n),用来匹配 DOS 行终止符

零宽度断言(前后预查)

"?=" - 正先行断言(存在)

"?!" - 负先行断言(排除)

"?<=" - 正后发断言(存在)

"?<!" - 负后发断言(排除)
"先行断言"和"后发断言"都属于非捕获簇(不捕获"文本",也不针对组合进行"计数"),"匹配的结果"不包含该确定格式(仅作为约束)。

1. 先行断言用于判断所匹配的格式是否在另一个确定的格式之前(确定的格式由"先行断言匹配")
2. 后发断言用于判断所匹配的而是是否在另一个确定的格式之后(确定的格式由后发"断言匹配")

零宽度断言(前后预查)的简单说明:我要从一个字符串中挑出 123.但是这个 123 与众不同,只有和其他字符靠近在一起的 123 (零宽度断言的约束条件)才是我想要的 123。

ps:正、负的关系与 [] 、[^] 的关系一样,匹配或除此之外

如:

1. 我要的 123(匹配格式) 后面(先行断言)靠着 abc(确定格斯),(123)(?=abc)
2. 我要的 123(匹配格式) 前面靠着(后发断言) 456(确定格式),(?<=456)(123)

标志

i - 忽略大小写

g - 全局搜索

m - 多行的: 锚点元字符 ^ $ 工作范围在每行的起始

贪婪匹配与惰性匹配

正则表达式默认采用贪婪匹配模式,在该模式下意味着会匹配尽可能长的子串。我们可以使用 ? 将贪婪匹配模式转化为惰性匹配模式。

贪婪 => 惰性 = "/(.*at)/" => "/(.*?at)/"