正则表达式

Posted liea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式相关的知识,希望对你有一定的参考价值。

正则表达式

字符组

字符组是有 [ ] 包含的一串字符内容来表示可以匹配的某一个字符。例: [012356789] 、[abcdefgh]、[0-9]、[a-z]、[A-Z]、[0-9a-zA-Z]。

- 表是数值的范围例如: [0-6] 、[a-f]

出现在不同位置表示不同的含义

// 作为普通字符
let str = 'fdsf323f23sf'
let reg = /^[-09]$/.test(str)
let reg1 = /[0-9]/.test(str)
// 作为元字符
let reg2 = /^[0-9]$/.test(str) 

排除型字符组

// 第一个字符为非0到9的数字,第二位是0到9的数字
let reg = /[^0-9][0-9]/.test('a7') // true

-d 代表 0-9范围的数字

-w 代表 0-9 a-z A-Z 范围内的数字及大小写字母。

-s 代表 空格 制表符 回车 等空白字符

-S 代表非空格 制表符 回车

量词

在表达式中如果出现多个重复字符例如: ^dddddd$ 用来表示 6位数字的话,需要重复写6次,虽然很直观但是不方便读写,正则表达式提供了量词 用{n} 来表示例如: ^d{6}$ 这样以来就更加简洁方便了,量词还可以表示不确定的长度用 {m,n}表示,需要注意的是这里的m和n中间的的逗号后面没有空格,这一点可能与平时写业务代码的规范不太一样。其中m代表下限n代表上限,m如果不写则默认为0,例如:^d{,6}$ 这里的m省略了,但是实际含义为 ^d{0,6}$ 这里的m参数在某些语言中可以省略但是为了提高兼容性不建议这么做。

{n} 元素必须出现的次数
{m,n} 元素必须出现的次数范围
{0,n} 元素必须出现的次数范围为 0 - n 
{m,} 元素必须出现的最小次数为m最大次数为无上限

常用量词:

*  相当于 {0,} 可能出现也可能不出现 出现次数无限制
+  相当于 {1,} 至少出现1次,出现次数没有上限
? 相当于{0,1} 至多出现1次可能不出现

数据提取

/reg/.exec(str)

let url = '<a herf="https://baidu.com/?word=hello">百度一下</a>'
// 获取网址
let res = /<asherf="[sS]*?</a>/g

断言

正则表达式大多数匹配文本会出现在匹配结果中,而有些结构并不是真正的匹配文本,只用来判断某个位置左右侧的文本是否符合要求,这种结构叫做断言??。断言有三类:单词边界、行起始/结束位置、环视。

单词边界:

正常情况下单词一般是有空格隔开的,如果直接用开发语言中的替换操作,除了会替换目标单词,还会把某个单词中的部分内容替换掉。例如 替换在字符串 ‘the row we are looking for is row’ 调用字符串方法替换处理即可,但是像 ‘tomorrow i will wear in brown standing in row 10’ 这时用字符串的替换操作会把 tommorrow 中的row也替换成 tomorline,这显然不是预期。而正则中的单词边界就是解决这类问题。他的语法时 单词

行起始结束位置:

^ 一般用来定义起始位置,$ 用来定义结束位置。

环视:

环视可以理解成在某个位置向左/向右看必须出现或不能出现特定字符。环视类似于单词边界,在它旁边的文本需要满足某种条件,而且本身不匹配任何字符。比如 <(?!) 其中(?!) 是环视结构,(?!...) 是结构标识 ?是表达式。

  • (?=...) 向右肯定顺序环视
  • (?!...) 向右否定顺序环视
  • (?<=...) 向左肯定逆序环视
  • (?<!...) 向左否定逆序环视

向右判断为顺序环视,向左为逆序环视。表达式中的字符必须出现为肯定环视,不能出现为否定环视。

匹配模式

匹配模式值得是匹配时遵循的规则,设置指定的模式,可能会改变正则表达式的的识别,也可能会改变正则表达式中字符匹配规定。常用的匹配模式有四种:不区分大小写模式、单行模式、多行模式、注释模式。

不区分大小写模式:

此模式下在匹配过程中对字母的大小写不做区分。设置方式为模式修饰符 i 的形式,例如 /test/i

/HELLO/i 在实际匹配过程中可以看多是大小写无区分的。预定义常量 /regexp/i

单行模式:

元字符 . 号能匹配所有字符,但 换行符除外。这是正则表达式中的规则。如果出现了 那么匹配就只能延伸到这一行的末尾而不能继续匹配下去。如果确保文本内容没有换行,那么用 . 号修饰符使用会相当简单直观。单行模式的修饰符是 s 可以在表达式的开头用 (?s) 指定。例如:/(?s)d{6}/ 设置了单行模式则 . 号可以匹配换行符。在javascript中此特性从ES2017开始支持。

多行模式:

多行模式看起来与单行模式是对应的,实则没有任何联系。单行模式影响的是: . 号的匹配规则(默认模式 . 号不匹配换行符 ,单行模式可以匹配换行)。多行模式影响的是:^$ 的匹配规则(默认模式^$ 匹配整个字符串的起始和结束位置,但多行模式^$ 也能匹配字符串内的某一行)。 多行模式可以在开头用 (?m) 指定,这样可以定位到字符串某一行中来指定起始或结束位置。例如: /(?m)d{1,6}/ 在JavaScript中不支持这种模式修饰符写法,多行模式预定义常量 /regexp/m

注释模式:

有时候正则表达式比较复杂不便于阅读和编写难以维护,而注释模式就是为了解决这个问题。许多语言支持使用 (?#commnet) 的记法添加注释,comment 为注释内容。目前JavaScript和Golang不支持这种写法。注释模式的修饰符是 x ,注释模式预定义常量 /regexp/x

以上是关于正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

markdown 正则表达式模式片段

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

循环通过 python 正则表达式匹配

asp.net 使用正则表达式验证包含打开/关闭括号片段的属性字符串

攻破难啃的骨头-正则表达式(转)

正则表达式的贪婪和非贪婪模式