正则表达式学习笔记

正则表达式

什么是正则表达式?

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

参考 菜鸟教程-正则表达式

参考git著名3w star的项目 learn-regex

在线练习地址:https://regex101.com/

正则的用处

  • 数据验证
  • 替换文本
  • 提取子字符串

标记符举例&简写字符集讲解

正则以/expression/的形式呈现

  • .表示除了"新行"之外的所有字符
  • .*代表任意字符串,贪婪模式,最大化匹配
  • .*?代表任意字符串,非贪婪模式,遇到第一个结束符就停
  • ^是匹配字符串的开始位置,当在一组方括号里使用 ^ 时,它表示""或"排除"的意思,常常用来剔除某个字符
  • [a-z]表示字母,[ ^a-z]表示任意非字母
  • “[0-9]“表示一个数字
  • ”[0-9]+“ 表示多个数字
  • 以上为中括号表达式,其中-可以表示范围,按 Unicode 排序顺序
  • abc$表示以abc结尾的字符串
  • x|y表示x或者y
  • [xyz]字符集合,表示i匹配里面的任意一个字符
  • [^xyz]表示除了xyz意外的所有任意字符
  • \b匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'
  • \B匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。

不同括号的区别

1、圆括号是取多个,圆括号将括号里面的内容作为一组,方括号是取一个,就算写成这样 [es|ed|s|ly|ing|d]也是一个个取,正确做法是用圆括号

2、方括号里面的|选择符号没有意义

3、圆括号还表示组,表示反向引用,

4、大括号表示数目

语法

正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。

正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

1.普通字符

普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。

2.限定符

  • +表示前面的字符至少出现一次
  • *表示前面的字符零个或者多个
  • ?表示前面的字符匹配0个或者一个

在上面字符后加上?表示由贪婪匹配转化为非贪婪匹配

  • {n}表示前面的字符固定出现n次
  • {n,}表示前面的字符出现n到正无穷次
  • {n,m}表示前面的字符出现n到m次

3.特殊字符

以下字符在使用是必须加\进行转义,因为本身为特殊含义

$ ( ) * + . [ ? ] \ ^ { | }

4.定位符

  • ^表示字符串开始的文字,如^fay表示从fay开始
  • $表示字符串结束的文字
  • \b
  • \B

5.标志

标志 描述
i 忽略大小写。
g 全局搜索。
m 多行修饰符:锚点元字符 ^ $ 工作范围在每行的起始。

标志在/expression/之后写,为了修改表达式搜索结果可任何组合使用

g表示返回所有的结果而不是只匹配到第一个

如果不使用m,则定位符只会在字符串的开头结尾,如果加上m则表示在多行都有

如以下会把fat,sat,mat都搜到:

"/.at(.)?$/gm" => The fat
                  cat sat
                  on the mat.

6.圆括号表达式

完全匹配

(xyz)表示与xyz完全相等的字符串,常与{}搭配使用

选择

用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。

如匹配章节/^(Chapter|Section) [1-9][0-9]{0,1}$/

但是括号还将捕获两个匹配字中的任一个供以后使用,若要防止匹配被保存以备将来使用,在括号内正则表达式模式之前放置 ?:

/^(?:Chapter|Section) [1-9][0-9]{0,1}$/

反向引用

零宽度断言(前后预查)

先行断言和后发断言都属于非捕获簇(不捕获文本 ,也不针对组合计进行计数)。 先行断言用于判断所匹配的格式是否在另一个确定的格式之前,匹配结果不包含该确定格式(仅作为约束)。

例如,我们想要获得所有跟在 $ 符号后的数字,我们可以使用正后发断言 (?<=\$)[0-9\.]*。 这个表达式匹配 $ 开头,之后跟着 0,1,2,3,4,5,6,7,8,9,. 这些字符可以出现大于等于 0 次。

零宽度断言如下:

符号 描述
?= 正先行断言-存在
?! 负先行断言-排除
?<= 正后发断言-存在
?<! 负后发断言-排除

7.运算符优先级

  1. 转义符
  2. 圆括号和方括号(), (?:), (?=), []
  3. 限定符*, +, ?, {n}, {n,}, {n,m}
  4. 任何元字符和字符
  5. 或操作|

举例

^[a-zA-Z0-9_]{1,}$      // 所有包含一个以上的字母、数字或下划线的字符串 
^[1-9][0-9]{0,}$        // 所有的正整数 
^\-{0,1}[0-9]{1,}$      // 所有的整数 
^[-]?[0-9]+\.?[0-9]+$   // 所有的浮点数
以上也可以表达为
^[a-zA-Z0-9_]+$      // 所有包含一个以上的字母、数字或下划线的字符串 
^[1-9][0-9]*$        // 所有的正整数 
^\-?[0-9]+$          // 所有的整数 
^[-]?[0-9]+(\.[0-9]+)?$ // 所有的浮点数
($表示没有其他字符在最后)

/<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>/    匹配 HTML 标记。
/\b([a-z]+) \1\b/gi   一个单词连续出现的位置。
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/  将一个URL解析为协议、域、端口及相对路径。
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/   定位章节的位置。

正则表达式练习题

https://www.cnblogs.com/s593941/p/9493425.html

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注