学习正则表达式
什么是正则表达式 ?
正则表达式是一种被用于从文本中检索符合某些特定模式的文本。
正则表达式是从左到右来匹配一个字符串的。"Regular Expression"这个词太长了,我们通常使用它的缩写"regex"或者"regexp"。
正则表达式可以被用来替换字符串中的文本、验证表单、基于模式匹配从一个字符串中提取字符串等等。
想象一下,您正在编写应用程序,并且您希望在用户选择用户名时设置规则。我们希望用户名可以包含字母,数字,下划线和连字符。
为了让它看起来不丑,我们还想限制用户名中的字符数量。这时我们可以使用以下正则表达式来验证用户名:
上面这个正则表达式可以匹配 john_doe ,jo-hn_doe 和 john12_as 。但是它不能匹配 Jo ,因为该字符串里面包含大写字符,并且它太短了。1. 基本匹配
正则表达式只是我们用于在文本中检索字符串的模式。例如正则表达式 cat ,表示:字母 c 后面跟着一个字母 a ,再后面跟着一个字母 t 。"cat" => The cat sat on the mat
正则表达式 123 会匹配字符串"123"。通过将正则表达式中的每个字符逐个与要匹配的字符串中的每个字符进行比较,来完成正则匹配。
正则表达式通常区分大小写,因此正则表达式 Cat 与字符串"cat"不匹配。"Cat" => The cat sat on the Cat 2. 元字符
元字符是正则表达式的基本组成元素。元字符在这里跟它通常表达的意思不一样,而是以某种特殊的含义去解释。有些元字符在写在方括号内时有特殊含义。
元字符如下:
元字符
描述
.
匹配除换行符以外的任意字符。
[ ]
字符类,匹配方括号中包含的任意字符。
[^ ]
否定字符类。匹配方括号中不包含的任意字符
*
匹配前面的子表达式零次或多次
+
匹配前面的子表达式一次或多次
?
匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。
{n,m}
花括号,匹配前面字符至少 n 次,但是不超过 m 次。
(xyz)
字符组,按照确切的顺序匹配字符 xyz。
|
分支结构,匹配符号之前的字符或后面的字符。
转义符,它可以还原元字符原来的含义,允许你匹配保留字符 [ ] ( ) { } . * + ? ^ $ |
^
匹配行的开始
$
匹配行的结束 2.1 英文句号
英文句号 . 是元字符的最简单的例子。元字符 . 可以匹配任意单个字符。它不会匹配换行符和新行的字符。例如正则表达式 .ar ,表示:任意字符后面跟着一个字母 a ,
再后面跟着一个字母 r 。".ar" => The car parked in the garage. 2.2 字符集
字符集也称为字符类。方括号被用于指定字符集。使用字符集内的连字符来指定字符范围。方括号内的字符范围的顺序并不重要。
例如正则表达式 [Tt]he ,表示:大写 T 或小写 t ,后跟字母 h ,再后跟字母 e 。"[Tt]he" => The car parked in the garage.
然而,字符集中的英文句号表示它字面的含义。正则表达式 ar[.] ,表示小写字母 a ,后面跟着一个字母 r ,再后面跟着一个英文句号 . 字符。"ar[.]" => A garage is a good place to park a car. 2.2.1 否定字符集
一般来说插入字符 ^ 表示一个字符串的开始,但是当它在方括号内出现时,它会取消字符集。例如正则表达式 [^c]ar ,表示:除了字母 c 以外的任意字符,后面跟着字符 a ,
再后面跟着一个字母 r 。"[^c]ar" => The car parked in the garage. 2.3 重复
以下元字符 + ,* 或 ? 用于指定子模式可以出现多少次。这些元字符在不同情况下的作用不同。2.3.1 星号
星号 * 表示匹配上一个匹配规则零次或多次。正则表达式 a* 表示小写字母 a 可以重复零次或者多次。但是它如果出现在字符集或者字符类之后,它表示整个字符集的重复。
例如正则表达式 [a-z]* ,表示:一行中可以包含任意数量的小写字母。"[a-z]*" => The car parked in the garage #21.
星号 * 可以与元符号 . 用在一起,用来匹配任意字符串 .* 。星号 * 可以与空格符 s 一起使用,用来匹配一串空格字符。
例如正则表达式 s*cats* ,表示:零个或多个空格,后面跟小写字母 c ,再后面跟小写字母 a ,再在后面跟小写字母 t ,后面再跟零个或多个空格。"s*cats*" => The fat cat sat on the cat. 2.3.2 加号
加号 + 表示匹配上一个字符一次或多次。例如正则表达式 c.+t ,表示:一个小写字母 c ,后跟任意数量的字符,后跟小写字母 t 。"c.+t" => The fat cat sat on the mat. 2.3.3 问号
在正则表达式中,元字符 ? 用来表示前一个字符是可选的。该符号匹配前一个字符零次或一次。
例如正则表达式 [T]?he ,表示:可选的大写字母 T ,后面跟小写字母 h ,后跟小写字母 e 。"[T]he" => The car is parked in the garage. "[T]?he" => The car is parked in the garage. 2.4 花括号
在正则表达式中花括号(也被称为量词?)用于指定字符或一组字符可以重复的次数。例如正则表达式 [0-9]{2,3} ,表示:匹配至少 2 位数字但不超过 3 位(0 到 9 范围内的字符)。"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.
我们可以省略第二个数字。例如正则表达式 [0-9]{2,} ,表示:匹配 2 个或更多个数字。如果我们也删除逗号,则正则表达式 [0-9]{2} ,表示:匹配正好为 2 位数的数字。"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0. "[0-9]{2}" => The number was 9.9997 but we rounded it off to 10.0. 2.5 字符组
字符组是一组写在圆括号内的子模式 (...) 。正如我们在正则表达式中讨论的那样,如果我们把一个量词放在一个字符之后,它会重复前一个字符。
但是,如果我们把量词放在一个字符组之后,它会重复整个字符组。
例如正则表达式 (ab)* 表示匹配零个或多个的字符串"ab"。我们还可以在字符组中使用元字符 | 。例如正则表达式 (c|g|p)ar ,表示:小写字母 c 、g 或 p 后面跟字母 a ,后跟字母 r 。"(c|g|p)ar" => The car is parked in the garage. 2.6 分支结构
在正则表达式中垂直条 | 用来定义分支结构,分支结构就像多个表达式之间的条件。现在你可能认为这个字符集和分支结构的工作方式一样。
但是字符集和分支结构巨大的区别是字符集只在字符级别上有作用,然而分支结构在表达式级别上依然可以使用。
例如正则表达式 (T|t)he|car ,表示:匹配大写字母 T 或小写字母 t ,后面跟小写字母 h ,后跟小写字母 e ,或匹配小写字母 c ,后跟小写字母 a ,后跟小写字母 r 。"(T|t)he|car" => The car is parked in the garage. 2.7 转义特殊字符
正则表达式中使用反斜杠 来转义下一个字符。这将允许你使用保留字符来作为匹配字符 { } [ ] / + * . $ ^ | ? 。在特殊字符前面加 ,就可以使用它来做匹配字符。
例如正则表达式 . 是用来匹配除了换行符以外的任意字符。现在要在输入字符串中匹配 . 字符,正则表达式 (f|c|m)at.? ,表示:小写字母 f 、c 或者 m 后跟小写字母 a ,后跟小写字母 t ,后跟可选的 . 字符。"(f|c|m)at.?" => The fat cat sat on the mat. 2.8 定位符
在正则表达式中,为了检查匹配符号是否是起始符号或结尾符号,我们使用定位符。
定位符有两种类型:第一种类型是 ^ 检查匹配字符是否是起始字符,第二种类型是 $ ,它检查匹配字符是否是输入字符串的最后一个字符。2.8.1 插入符号
插入符号 ^ 符号用于检查匹配字符是否是输入字符串的第一个字符。如果我们使用正则表达式 ^a (如果 a 是起始符号)匹配字符串 abc ,它会匹配到 a 。
但是如果我们使用正则表达式 ^b ,它是匹配不到任何东西的,因为在字符串 abc 中"b"不是起始字符。
让我们来看看另一个正则表达式 ^(T|t)he ,这表示:大写字母 T 或小写字母 t 是输入字符串的起始符号,后面跟着小写字母 h ,后跟小写字母 e 。"(T|t)he" => The car is parked in the garage. "^(T|t)he" => The car is parked in the garage. 2.8.2 美元符号
美元 $ 符号用于检查匹配字符是否是输入字符串的最后一个字符。例如正则表达式 (at.)$ ,表示:小写字母 a ,后跟小写字母 t ,后跟一个 . 字符,且这个匹配器必须是字符串的结尾。"(at.)" => The fat cat. sat. on the mat. "(at.)#34; => The fat cat sat on the mat. 3. 简写字符集
正则表达式为常用的字符集和常用的正则表达式提供了简写。简写字符集如下:
简写
描述
.
匹配除换行符以外的任意字符
w
匹配所有字母和数字的字符: [a-zA-Z0-9_]
W
匹配非字母和数字的字符: [^w]
d
匹配数字: [0-9]
D
匹配非数字: [^d]
s
匹配空格符: [ frp{Z}]
S
匹配非空格符: [^s] 4. 断言
后行断言和先行断言有时候被称为断言,它们是特殊类型的 非捕获组 (用于匹配模式,但不包括在匹配列表中)。当我们在一种特定模式之前或者之后有这种模式时,会优先使用断言。
例如我们想获取输入字符串 $4.44 and $10.88 中带有前缀 $ 的所有数字。我们可以使用这个正则表达式 (?<=$)[0-9.]* ,表示:获取包含 . 字符且前缀为 $ 的所有数字。
以下是正则表达式中使用的断言:
符号
描述
?=
正向先行断言
?!
负向先行断言
?<=
正向后行断言
?
负向后行断言 4.1 正向先行断言
正向先行断言认为第一部分的表达式的后面必须是先行断言表达式。返回的匹配结果仅包含与第一部分表达式匹配的文本。
要在一个括号内定义一个正向先行断言,在括号中问号和等号是这样使用的 (?=...) 。先行断言表达式写在括号中的等号后面。
例如正则表达式 (T|t)he(?=sfat) ,表示:匹配大写字母 T 或小写字母 t ,后面跟字母 h ,后跟字母 e 。
在括号中,我们定义了正向先行断言,它会引导正则表达式引擎匹配后面跟着 fat 的 The 或 the 。"(T|t)he(?=sfat)" => The fat cat sat on the mat. 4.2 负向先行断言
当我们需要指定第一部分表达式的后面不跟随某一内容时,使用负向先行断言。负向先行断言的定义跟我们定义的正向先行断言一样,
唯一的区别在于我们使用否定符号 ! 而不是等号 = ,例如 (?!...) 。
我们来看看下面的正则表达式 (T|t)he(?!sfat) ,表示:从输入字符串中获取全部 The 或者 the 且不匹配 fat 前面加上一个空格字符。"(T|t)he(?!sfat)" => The fat cat sat on the mat. 4.3 正向后行断言
正向后行断言用于获取跟随在特定模式之后的所有匹配内容。正向后行断言表示为 (?<=...) 。例如正则表达式 (?<=(T|t)hes)(fat|mat) ,表示:从输入字符串中获取在单词 The 或 the 之后的所有 fat 和 mat 单词。"(?<=(T|t)hes)(fat|mat)" => The fat cat sat on the mat. 4.4 负向后行断言
负向后行断言是用于获取不跟随在特定模式之后的所有匹配的内容。负向后行断言表示为 (? 。例如正则表达式 (? ,表示:在输入字符中获取所有不在 The 或 the 之后的所有单词 cat 。"(? The cat sat on cat. 5. 标记
标记也称为修饰符,因为它会修改正则表达式的输出。这些标志可以以任意顺序或组合使用,并且是正则表达式的一部分。
标记
描述
i
不区分大小写:将匹配设置为不区分大小写。
g
全局搜索:搜索整个输入字符串中的所有匹配。
m
多行匹配:会匹配输入字符串每一行。 5.1 不区分大小写
i 修饰符用于执行不区分大小写匹配。例如正则表达式 /The/gi ,表示:大写字母 T ,后跟小写字母 h ,后跟字母 e 。
但是在正则匹配结束时 i 标记会告诉正则表达式引擎忽略这种情况。正如你所看到的,我们还使用了 g 标记,因为我们要在整个输入字符串中搜索匹配。"The" => The fat cat sat on the mat. "/The/gi" => The fat cat sat on the mat. 5.2 全局搜索
g 修饰符用于执行全局匹配(会查找所有匹配,不会在查找到第一个匹配时就停止)。
例如正则表达式 /.(at)/g ,表示:除换行符之外的任意字符,后跟小写字母 a ,后跟小写字母 t 。
因为我们在正则表达式的末尾使用了 g 标记,它会从整个输入字符串中找到每个匹配项。".(at)" => The fat cat sat on the mat. "/.(at)/g" => The fat cat sat on the mat. 5.3 多行匹配
m 修饰符被用来执行多行的匹配。正如我们前面讨论过的 (^, $) ,使用定位符来检查匹配字符是输入字符串开始或者结束。但是我们希望每一行都使用定位符,所以我们就使用 m 修饰符。
例如正则表达式 /at(.)?$/gm ,表示:小写字母 a ,后跟小写字母 t ,匹配除了换行符以外任意字符零次或一次。而且因为 m 标记,现在正则表达式引擎匹配字符串中每一行的末尾。"/.at(.)?$/" => The fat cat sat on the mat. "/.at(.)?$/gm" => The fat cat sat on the mat. 常用正则表达式正整数 : ^d+$ 负整数 : ^-d+$ 电话号码 : ^+?[ds]{3,}$ 电话代码 : ^+?[ds]+(?[ds]{10,}$ 整数 : ^-?d+$ 用户名 : ^[wd_.]{4,16}$ 字母数字字符 : ^[a-zA-Z0-9]*$ 带空格的字母数字字符 : ^[a-zA-Z0-9 ]*$ 密码 : ^(?=^.{6,}$)((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.*$ 电子邮件 : ^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,4})*$ IPv4 地址 : ^((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))*$ 小写字母 : ^([a-z])*$ 大写字母 : ^([A-Z])*$ 网址 : ^(((http|https|ftp)://)?([[a-zA-Z0-9]-.])+(.)([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]/+=%&_.~?-]*))*$ VISA 信用卡号码 : ^(4[0-9]{12}(?:[0-9]{3})?)*$ 日期(MM/DD/YYYY) : ^(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}$ 日期(YYYY/MM/DD) : ^(19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])$ 万事达信用卡号码 : ^(5[1-5][0-9]{14})*$
中兴中铝信通院发布5G赋能有色金属行业智能化发展白皮书近日,绿色冶金高峰论坛在云南昆明召开,本次论坛以智融滇冶绿创未来为主题,旨在全面支撑云南打造绿色能源牌战略实现有色金属强省和工业能源中坚力量的目标。峰会上,中国信通院中铝集团云南移
产业数字化的大江大河需要云安全这样守护(图片来源摄图网)(记者杜峰)数据自动备份,手机PC平板多设备同步,云盘上传下载不限量纷繁多样的云,让人们享受着云服务便捷的同时,也不禁为数据安全担忧。近日,在中国信息通信研究院可
整治吃拿卡要专项行动新绛县新城幼儿园召开整治吃拿卡要专项行动动员会为深入贯彻落实新绛县教育系统整治吃拿卡要专项行动实施方案精神,进一步优化工作作风,新绛县新城幼儿园于2月16日召开整治吃拿卡要专项行动动员大会,全园教师参加会议。张彩慧园长传达了新
抗美援朝经典一战铁原阻击战,志愿军给美军办了一场中国式葬礼在阅读此文前,诚邀您点击一下关注,既方便您进行讨论与分享,又给您带来不一样的参与感,感谢您的支持。在今天的朝鲜境内,有一座著名的冰激凌山,之所以叫这样一个奇怪的名字,是因为在半个世
灌篮高手在大学球队眼里,为何他们更在意高砂,而不选三井?头条创作挑战赛灌篮高手中湘北打完山王,就进入剧情年了,在这一年里不少球队都会损失一定的名将,因为他们已经高中毕业了,要去上大学了,所有人几乎是分道扬镳,而实力强悍的选手已经拿到了某
男孩被同学扔下4楼校园欺凌,远比我们想象的要可怕校园欺凌事件频发,给孩子幼小的心灵造成了不可逆转的伤害。身体伤害可愈合,心理伤害却无法愈合。作为家长,关心孩子,但不可能一天24小时陪在孩子身边。在你看不见的校园中,孩子正经历着什
人到晚年,最好的活法,四不沾人到晚年,岁月静好,偶尔感到孤独,孤独,却也挺好。没有人打扰,就静静地活着。只要身体好,就可以幸福的养老。只要心态好,就可以身心舒畅。人到晚年,虽然获得了清闲,却不能造次。多多关心
新书包太贵日企推出租书包业务来源新华网随着4月日本的新学期临近,给学生购置新书包成为一些家庭不小的开销。为此,大阪书包经销商国保推出了号称日本独一份的书包租赁服务。2018年12月6日,在日本东京,小学生们参
让雷锋精神在青少年中代代相传让雷锋精神在青少年中代代相传贺军科今年是毛泽东等老一辈革命家为雷锋同志题词60周年。60年来,雷锋的名字响彻神州大地,学习雷锋好榜样成为一代代中国人心中温暖的成长记忆,成为鼓舞和激
雷锋精神代代传我们都是永远的追锋少年作为一名年轻的偏远乡村一线教师,我认为传承和践行雷锋精神最需要我们当老师的身教,一个人带动一群人,不是这一阵子,而是要坚持一辈子,立足岗位多做实事。在教育教学中,我常与学生分享我读
三本现实小说,故事精彩,文笔优美,引人发思!你喜欢吗?喜欢的点赞收藏关注哦爱慕第一本痕迹完结简介魏民章琪罗来金三个大中专毕业生从金口乡走向社会由于各人的性格特点和价值取向的不同,他们留下了不同的人生痕迹,发人深省。入坑指南这是20世纪
区块链到底是什么区块链是一种去中心化的分布式账本数据库,本质上是一种数据库技术,不再像过去一样需要第三方中介来作担保。每个区块就像是一个硬盘,把信息全部保存下来,再通过密码学技术进行加密,这些保存
齐鲁政情亩均税收不足万元到百万元,山东这个区怎么做到的?我们去年进行的第一期出清,有些企业亩均税收不足1万元,且以出租为主。2月21日,淄博市张店区召开三提三争看张店之产业转型提升行动新闻发布会上,张店经济开发区相关负责人介绍,张店经济
一个重要消息来了,A股,周四行情预判行情,没有好坏,明明上证综合指数还在3300点,怎么一片唱空?好像天塌了一样,大家不是喜欢看指数吗?现在上证综合指数,是点位不满意吗?重返3300点,不是满足我们了。因为,市场没有
2023年2月22日钾肥行情钾肥氯化钾钾肥市场整体未有较大的变动,虽然部分区域价格报价混乱,但在市场整体需求有限的情况下,实际新单成交不足。目前进口62白钾价格多在36503730元吨,南北价格略高,中间价格
全面评测问界M7,靠着华为爆火,它才是汽车界中的流量明星我们常把娱乐圈中的一些演员叫做明星,其中没什么作品,单纯依靠一张脸吸引粉丝的人叫做流量明星,而网上不少人将问界M7称作汽车行业的流量明星,因为问界M7背后是华为,而华为有多少话题,
格言(13至24)十三小文章大学问。短小精悍,一事一议,豆腐干短文,同样很有力。前进路上需长篇大论,也提倡短篇小作,一二百字。画龙点睛,列出标题,客观地反映真事,有简述有分析,透过现象看本质,语言精
当一个人看透了人性会怎么样呢?1远离少妇。2闷声,发大财。3做人,不能太善良。4不要与任何人走得太近。5聊天,就聊点别人爱听的。6努力赚钱,才是硬道理。7有钱,才是王道。8没有实力,少说话。9自己不优秀,认识谁
芹菜面粉这样做,我家一周吃5次,好吃过瘾解馋,吃一口念念不忘芹菜面粉这样做,我家一周吃5次,好吃过瘾解馋,吃一口念念不忘。芹菜不仅脆嫩可口,营养也很丰富,含有较多的钙,磷铁及维生素A原维生索C维生素P等,具有清胃涤痰,祛风理气,利口齿爽咽喉
为什么火车上总是在卖德州扒鸡?阿信不论是绿皮火车,还是在风驰电掣的高铁上,吃货们总是对那些火车美食念念不忘方便面火腿肠卤蛋,还有遍布全国的山东特产德州五香脱骨扒鸡。中国有那么多做鸡的方法,但是为什么火车上总是在
集咸脆鲜甜于一体,这道小吃不容错过!又到一年花开的季节,虽然申城还未正式入春,但是大家是否已经感受到春天的气息了呢?今天,就为大家推荐一款集咸脆鲜甜于一体的特色小吃春饼,一起来抢鲜品尝春之味!皮薄肉厚口感丰富,快来试
山东老字号周村烧饼脱胎于千年前胡饼的中华名吃闲话老字号,兴衰总关情。今天要推介的山东老字号是一款美食周村烧饼。周村烧饼源于东汉,成于晚清,盛于当代,源远流长,香飘四方,并以独特的传统手工生产工艺考究的选料配方以及酥香薄脆四大