前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >正则表达式

正则表达式

作者头像
matt
发布2022-10-25 15:54:03
4550
发布2022-10-25 15:54:03
举报
文章被收录于专栏:CSDN迁移CSDN迁移

正则表达式

一、基本介绍

正则表达式(Regular Expression,简称Regex)是在一个主体字符串中从左到右匹配字符串时的一种样式。

  • 大小写敏感
  • 默认采用贪婪匹配,会匹配尽可能长的子串(优先)
  • 默认捕获第一个匹配的字符串

点击自行练习

二、元字符

正则表达式主要依赖于元字符. 元字符不代表他们本身的字面意思, 他们都有特殊的含义。需要注意的是,一些元字符写在方括号中的时候有一些特殊的意思。

在这里插入图片描述
在这里插入图片描述

严格从末尾匹配,“任一除换行符的字符”+“at” 加或者不加 “.”,即"(.)at"或"(.)at(.)"。

代码语言:javascript
复制
# 匹配"mat.",加上"."因为是贪心
# 若最后一行为"on the ma",则无法匹配任何
"/.at(.)?$/" => The fat
                cat sat
                on the mat.

2.1 . 点运算符

.匹配任意单个字符, 但不匹配换行符。

代码语言:javascript
复制
".ar" => car 或 war 或 jar 等

2.2 字符集(类)

1. 字符集

在方括号中使用连字符来指定单个字符集的范围,在方括号中的字符集不关心顺序。

代码语言:javascript
复制
"[Tt]he" => The 或 the

2. 否定字符集

一般来说 ^ 表示一个字符串的开头,但它用在一个方括号的开头的时候,它表示这个字符集是否定的。

代码语言:javascript
复制
# 不能是car
"[^c]ar" => war 等

2.3 重复字符

后面跟着元字符 + or * or ? 的,用来指定匹配子模式的次数,这些元字符在不同的情况下有着不同的意思。

1. * 号

*号匹配 在*之前的字符出现大于等于0次。

代码语言:javascript
复制
"[a-z]*" => 匹配一个行中所有以小写字母开头的字符串

表示匹配空格的符号\s

2. + 号

+号匹配+号之前的字符出现 >=1 次。

代码语言:javascript
复制
"c.+t" => cabc dt 或 ct

3. ? 号

? 标记在符号之前的字符为可选, 即出现 0 或 1 次。

代码语言:javascript
复制
"[T]he" => The 或 he

2.4 {} 号

{} 是一个量词,常用来一个或一组字符可以重复出现的次数。可以是{2},{2,}。

代码语言:javascript
复制
"[0-9]{2,3}" => 匹配最少 2~3 位 0~9 的数字

2.5 (…) 特征标群

在 {} 前加入特征标群则表示整个标群内的字符重复 N 次。例如,表达式 (ab)* 匹配连续出现 0 或更多个 ab。

代码语言:javascript
复制
"(c|g|p)ar" => car 或 gar 或 par
"(c){2,3}" => cc 或 ccc 

2.6 | 或运算符

或运算符就表示或,用作判断条件。

代码语言:javascript
复制
"(T|t)he|car" => The 或 the 或 car

2.7 转码特殊字符

反斜线 \ 在表达式中用于转码紧跟其后的字符,用于指定 { } [ ] / \ + * . $ ^ | ? 这些特殊字符。

代码语言:javascript
复制
"(f|c|m)at\.?" => fat. 或 cat 等

2.8 锚点

想要匹配指定开头或结尾的字符串就要使用到锚点,^ 指定开头,$ 指定结尾。

代码语言:javascript
复制
"^(T|t)he" => 匹配"The car is parked in the garage"字符串中的"The",不匹配the
"(at\.)$" => 匹配"The fat cat. sat. on the mat."字符串中mat.中的"at.",不匹配其他at.

3. 简写字符集

正则表达式提供一些常用的字符集简写。

在这里插入图片描述
在这里插入图片描述

4. 零宽度断言(前后预查)

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

在这里插入图片描述
在这里插入图片描述

4.1 ?=… 正先行断言——存在

筛选条件为:其后必须跟着断言定义的格式。

代码语言:javascript
复制
"(T|t)he(?=\sfat)" => 匹配"The fat cat sat on the mat."字符串中" fat"前的"The"

4.2 ?!.. 负先行断言

筛选条件为:其后不跟随着断言中定义的格式。

代码语言:javascript
复制
"(T|t)he(?!\sfat)" => 匹配"The fat cat sat on the mat."字符串中后面不紧跟着" fat"的"the"

4.3 ?<= … 正后发断言

筛选条件为:其前跟随着断言中定义的格式。

代码语言:javascript
复制
"(?<=the\s)(fat|mat)" => 匹配"The fat cat sat on the mat."字符串中"the "后面紧跟着的"mat"

4.4 ?<!.. 负后发断言

筛选条件为:其前不跟随着断言中定义的格式。

代码语言:javascript
复制
"(?<!The\s)(cat)" => 匹配"The cat sat on cat."字符串中"The "后面不紧跟着的"cat"

理解:例如"(T|t)he(?=\sfat)",匹配The或the,且其后必须紧跟着"(空格)fat"。

5. 标志

标志也叫模式修正符,因为它可以用来修改表达式的搜索结果,这些标志可以任意的组合使用。用//包含字符集,其后跟标志。

在这里插入图片描述
在这里插入图片描述

5.1 忽略大小写 (Case Insensitive)

匹配全局(g)忽略大小写(i)的"The""the""THE"等。

代码语言:javascript
复制
"/The/gi" => The fat cat sat on the mat.

5.2 全局搜索 (Global search)

匹配全局(g)"除了换行符的任意字符+at"的全部结果。

代码语言:javascript
复制
"/.(at)/g" => The fat cat sat on the mat.

5.3 多行修饰符 (Multiline)

匹配在每行的开头和结尾生效,用到多行修饰符 m。

代码语言:javascript
复制
# 匹配"fat"、"sat"、"mat."
"/.at(.)?$/gm" => The fat
                  cat sat
                  on the mat.

# 匹配最长的"mat."
"/.at(.)?$/" => The fat
                cat sat
                on the mat.

5.4 贪婪匹配与惰性匹配 (Greedy vs lazy matching)

正则表达式默认采用贪婪匹配模式,默认情况下,? + * {min, max}都是贪婪的。在该模式下意味着会匹配尽可能长的子串。我们可以在修饰匹配次数的特殊符号后再加上一个 ? ,将贪婪匹配模式转化为惰性匹配模式。

匹配默认匹配最长的,从开头一直到匹配到"fat"的"at",即"The fat"。

代码语言:javascript
复制
# 理解:惰性模式 "首部和尾部均第一次匹配成功,且首尾合理" 就停止,这里前面没有限定,从开头一直匹配到第一个at
"/(.*?at)/" => The fat cat sat on the mat. 

参考资料

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-09-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正则表达式
  • 一、基本介绍
  • 二、元字符
    • 2.1 . 点运算符
      • 2.2 字符集(类)
        • 1. 字符集
        • 2. 否定字符集
      • 2.3 重复字符
        • 1. * 号
        • 2. + 号
        • 3. ? 号
      • 2.4 {} 号
        • 2.5 (…) 特征标群
          • 2.6 | 或运算符
            • 2.7 转码特殊字符
              • 2.8 锚点
              • 3. 简写字符集
              • 4. 零宽度断言(前后预查)
                • 4.1 ?=… 正先行断言——存在
                  • 4.2 ?!.. 负先行断言
                    • 4.3 ?<= … 正后发断言
                      • 4.4 ?<!.. 负后发断言
                        • 5. 标志
                          • 5.1 忽略大小写 (Case Insensitive)
                            • 5.2 全局搜索 (Global search)
                              • 5.3 多行修饰符 (Multiline)
                                • 5.4 贪婪匹配与惰性匹配 (Greedy vs lazy matching)
                                领券
                                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档