容易忘的
- 小写字母是本意,大写字母是‘非’本意
- [] {} () 的作用
- ? + * 的含义
锚点
- 锚点就是匹配位置,记住是匹配位置
^-字串或行的开头 eg:
// 匹配`an`
an answer or a question
// [w]ord,^放在表达式前面
/^\w+/
$-字串或行的末尾
// 匹配 'question'
an answer or a question
// $ 放在表达式后面
/\w+$/
\b- 单词边界
- 匹配单词开头或末尾
- 其实就是所有\w和\W字符之间的
// 匹配 n 结尾的单词
an answer or a question number
解析:\b在n后表示以n结尾
/n\b/
解析:如果是匹配'number'
/\bn/
\B- 非单词边界
- 匹配不在单词开头或末尾的位置
// 匹配answer
an answer or a question
解析:单看\B,意思是所有\w和\W是\b,那么不是\b就是\B,两个\w之间的位置
用#表示出来了`a#n a#n#s#w#e#r o#r a q#u#e#s#t#i#o#n n#u#m#b#e#r`,
下面的表达式,代表了\B位置前是一个‘n’的情况
/n\B/
多看个例子:
如果字符串是 an answer or a question number
那么不只是answer,包括number也会被匹配上,因为number的n后边是个\B
以此类推 \Bn 的意思就是找到\B的位置,其后是个n的单词
标志
i
- 忽略大小写
- ignore
q:匹配这个字串
CAT
/cat/i
g
- 全局
- 表达式不会在检索到第一个匹配项时停止。
q:找出所有的cat
cat cat cat
/cat/g
m
- 多行
- 如果不启用,
^和$只匹配整个字符串的开始和结束,而不会单独匹配每一行。
q:匹配所有的cat
cat
cat
a cat
下面这个也是可以的
/cat/g
但是如果匹配每一行以cat开头的呢?就得
/^cat/gm
组和引用
()
- 组
- 引用表达式的分组
hahaha hah haha
匹配到所有ha
/(ha)+/g
\1
- 引用
- 引用表达式的分组,当然也可能是
\2\3,代表的是前面第n个小括号的内容
q:匹配所有 字符a字符 样式的字串
hah haa dad
这里的\1就相当于()里面的\w
/(\w)a\1/
还试了一下,如果要是匹配下面三个字串,用/(\w+)a\1/g时候发现,\w+匹配到什么
\1一定是相同的,不能吧比方\w+匹配到了ddsx,\1一定是ddsx,少个字符第三个都
匹配不上跟 /\w+a\w+/g 是不一样
tat dad ddsxaddsx
非捕获组
实际上是相对于捕获组而言 可以参考这个
字符类
| 字符 | 名称 | 含义 |
|---|---|---|
| [] | 字符集 | 匹配集合中的任意字符 |
| [^] | 否定字符集 | 匹配不在集合中的任意字符(注意这个跟锚点开头是一样的)。 |
| [a-z] | 范围 | 匹配两个字符之间的任意字符,包括它们本身。 |
| . | 点 | 匹配除换行符之外的任意字符。 |
| \w | 单词 | 匹配字母、数字或下划线。 |
| \W | 非单词 | 匹配除字母、数字和下划线之外的任意字符。 |
| \d | 数字 | 匹配所有数字。 |
| \D | 非数字 | 匹配除数字外的任意字符。 |
| \s | 空白符 | 匹配所有空白字符。 |
| \S | 非空白符 | 匹配除空白字符以外的任意字符。 |
量词与分支
| 字符 | 名称 | 含义 |
|---|---|---|
| ? | 可选 | 使表达式可选。 |
| + | 加号 | 表达式匹配一个或多个。 |
| * | 星号 | 表达式匹配零个或多个。 |
| {n, m} | 重复 | 表达式匹配指定范围的位数。至少n至多m |
| | | 分支 | 类似于“或”。用于匹配多种符合条件的表达式之一。eg: /(b|c)at/g |
零宽断言
- 零宽:只匹配位置,在匹配过程中,不占用字符,所以被称为零宽
(?=)
- 正向先行断言
- 正向:匹配括号中的表达式
- 先行:正则引擎在扫描字符的时候,从左往右扫描,匹配扫描指针未扫描过的字符,先于指针,故称先行
q: 为了只匹配后面有 PM 的数值,我们需要在表达式后面使用正向先行断言 (?=)。
Date: 4 Aug 3PM
/\d+(?=PM)/g
(?!)
- 负向先行断言
- 负向:不匹配括号中的表达式
- 先行: 正则引擎在扫描字符的时候,从左往右扫描,匹配扫描指针未扫描过的字符,先于指针,故称先行
例如,我们要在文本中匹配除小时值以外的数字。
我们需要在表达式后面使用负向先行断言 (?!),并在括号内的 ! 后面添加 PM,
从而只匹配没有 PM 的数值。
Date: 4 Aug 3PM
/\d+(?!PM)/g
(?<=)
- 正向后行断言
- 正向:匹配括号中的表达式
- 后行: 匹配指针已扫描过的字符,后于指针到达该字符,故称后行,即产生回溯
我们要匹配文本中的金额数。为了只匹配前面带有 $ 的数字。
我们要在表达式前面使用正向后行断言 (?<=),并在括号内的 = 后面添加 \$。
Product Code: 1064 Price: $5
/(?<=\$)\d+/g
(?<!)
- 负向后行断言
- 负向:不匹配括号中的表达式
- 后行: 匹配指针已扫描过的字符,后于指针到达该字符,故称后行,即产生回溯
我们要在文本中匹配除价格外的数字。
为了只匹配前面没有 $ 的数字,我们要在表达式前用负向后行断言 (?<!),并在括号内的 ! 后面添加 \$。
Product Code: 1064 Price: $5
/(?<!\$)\d+/g
贪婪匹配
正则表达式默认执行贪婪匹配。这意味着匹配内容会尽可能长。请看下面的示例,它匹配任何以 r 结尾的字符串,以及前面带有该字符串的文本,但它不会在第一个 r 处停止匹配。
ber beer beeer beeeer
/.*r/ 匹配到所有后缀为r的字串
懒惰匹配
与贪婪匹配不同,懒惰匹配在第一次匹配时停止。下面的例子中,在 * 之后添加 ?,将查找以 r 结尾且前面带有任意字符的第一个匹配项。这意味着本次匹配将会在第一个字母 r 处停止。
ber beer beeer beeeer
/.*?r/ 匹配到第一个ber