正则表达式

这一篇参考https://www.runoob.com/regexp/regexp-syntax.html

什么是正则

正则指的是正则表达式,从runoob找的定义是一种用于匹配和操作文本的强大工具,它是由一系列字符和特殊字符组成的模式,用于描述要匹配的文本模式。正则表达式可以在文本中查找、替换、提取和验证特定的模式。

  • abc+d,可以匹配abcd、abccd、abccccd、aaabcd等,+号代表前面的字符必须至少出现一次
  • abcd,可以匹配d、abcd、abcabcd等,号代表前面的字符可以不出现、出现一次或多次
  • abc?d 可以匹配abcd或abd,?问号表示前面的字符最多可以出现一次

普通字符

我们经常看到的/[a-zA-z]/这就属于普通字符,普通字符包括没有显式指定为元字符的所有可打印或不可打印字符。包括所有大小写字母,数字,标点和一些其他字符

接下来列举一些普通字符:

[abc] 表示字符串中与[]中相同的字符

[^abc]表示字符串中与[] 中不同的字符

[A-Z] 表示A到Z区间的所有字符

 .   表示匹配除了(\n、\r)之外的其他字符,可以相当于[^\n\r  ]

[\s\S] \s匹配所有空白符,\S匹配所有非空白符

(一般大写和小写对应的会是相反的)

\w 表示为[A-Za-z0-9_] 匹配含有字母数字下划线的字符

非打印字符

这里引用下runoob的描述

\cx 表示匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。

\f     匹配一个换页符。等价于 \x0c 和 \cL。

\n 匹配一个换行符。等价于\x0a和\cJ

\r 匹配一个回车符。等价于 \x0d 和 \cM。

\t 匹配一个制表符。等价于\x09和\cl.

\v 匹配一个垂直制表符.等价于\x0b和\cK

特殊字符

特殊字符如上面的abc d中的 ,这些特殊字符在查找的时候需要进行转义,即在其前面加一个\

下面列举一些特殊字符

$ 匹配 输入字符串的结尾位置,如果设置了RegExp对象,则$也匹配‘\n’或‘\r’,要匹配$字符本身,则需要使用\$

() 表示一个子表达式开始和结尾的位置 。匹配则要使用\( 和 \)

[ 表示一个表达式的开始

\ 表示将下一个字符标记为特殊字符 或原义字符 或向后引用 或八进制转义符 若要匹配\ 则需要使用\\ 

{ 表示标记限定符表达式的开始

| 指明两项之间的一个选择

限定符

限定符是用来指定正则表达式的某个部分必须要出现几次才能满足匹配

* 匹配前面的字符出现零次或多次 等价于{0,}

+ 匹配前面的子表达式一次或多次 等价于{1,}

?匹配前面的子表达式出现零次或一次 例:ab(cd)? 可以匹配ab abcd abef 等价于{0,1}

{n} n为非负整数 匹配确定的n次 例如a{3} 可以匹配aaabcd 中的三个a

{n,} n位非负整数 匹配至少n次

{n,m} n,m 都为非负整数,n<=m 最少匹配n次且最多m次

*和+限定符都是贪婪的,因为它们会尽可能匹配文字,只有在它们的后面加上一个? 就可以实现非贪婪或最小匹配

贪婪:下列的表达式匹配从开始小于字符(<)到关闭h1标记的大于字符(>)之间的所有内容

/<.*>/

.是匹配除了换行符的所有字符,*表示多个,因此可以实现匹配之间的所有内容

非贪婪:如果只需要匹配开始和结束h1标签,下面的非贪婪表达式只匹配

/<.*?>/

通过在 *+? 限定符之后放置 ?,该表达式从"贪婪"表达式转换为"非贪婪"表达式或者最小匹配。

定位符:

定位符能使你能够定位到正则表达式的行首或行尾。

字符串的开始和结尾一般用^和$来定位,\b描述单词的前或后边界,\B表示非单词边界

注意:不能将限定符与定位符一起使用。由于在紧靠换行或者单词边界的前面或后面不能有一个以上位置,因此不允许诸如 ^* 之类的表达式。

若要匹配一行文本开始处的文本,请在正则表达式的开始使用 ^ 字符。不要将 ^ 的这种用法与中括号表达式内的用法混淆。

若要匹配一行文本的结束处的文本,请在正则表达式的结束处使用 $ 字符。

\b的位置也很重要

如:/\babc/则说明abc位于前面边界,/abc\b/则说明abc位于后面边界

选择

选择需要用()将所有选项括号起来,相邻之间的选项需要用|分割

用圆括号会有一个副作用,使相关的匹配会被缓存,此时可用 ?: 放在第一个选项前来消除这种副作用。

其中 ?: 是非捕获元之一,还有两个非捕获元是 ?=?!

?= 例a(?=b) 是用来查找b前的a

?<= 例(?<=b)a用来查找b后的a

?! 例a(?!b) 查找后面没有b的a

?<! 例(?<!b)a 查找前面没有b的a

引用链接:

https://www.runoob.com/regexp/regexp-syntax.html

最后修改:2023 年 08 月 18 日
如果觉得我的文章对你有用,请随意赞赏