手机版

正则表达式学习参考推荐初学者

时间:2021-11-25 来源:互联网 编辑:宝哥软件园 浏览:

00-1010正则表达式是一种匹配模式,它描述了一串文本的特征。就像自然语言中的“高大”、“坚定”等词被抽象出来描述事物的特征一样,正则表达式也是高度抽象的字符,用来描述字符串的特征。正则表达式(以下简称Regex)通常不是独立存在的。各种编程语言和工具作为宿主语言,都为regex提供了支持,并且根据各自语言的特点,可以在一定程度上进行删减或扩展。正则化入门很容易,有限的语法规则也很容易掌握。但是目前正则化的普及程度并不高,主要是正则化的体裁比较多,各种宿主语言提供的文档过于注重自身的一些细节,初学者通常不需要。当然,如果你想更多地了解正则表达式,这些细节一定要注意。这是另一个故事。让我们从正则的基础开始,进入正则表达式的世界。

1 概述

2 正则表达式基础

2.1 基本概念

字符串“a5”由两个字符“A”、“5”和三个位置组成,这对理解正则表达式的匹配原理非常重要。

2.1.1 字符串组成

在正则表达式匹配过程中,如果子表达式匹配的是字符内容,而不是位置,并保存在最终的匹配结果中,则认为子表达式占用了字符;如果子表达式只匹配位置,或者匹配内容没有保存在最终的匹配结果中,那么子表达式被认为是零宽度的。字符是否占据零宽度取决于匹配的内容是否保存在最终的匹配结果中。占有字符互斥,零宽度不互斥。即一个字符只能同时匹配一个子表达式,而一个位置可以同时匹配多个宽度为零的子表达式。00-1010正则表达式由两个字符组成。一种是正则表达式中具有特定特殊含义的“元字符”,另一种是普通的“文本字符”。元字符可以是字符,如“”,也可以是字符序列,如“\w”。00-1010

2.1.2 占有字符和零宽度

字符集可以匹配[]中包含的任何字符。虽然可以是任何一个,但也只能是一个。字符组支持连字符“-”来表示一个范围。当“-”构成一个范围时,要求前一个字符的码位小于后一个字符的码位。[……]排除的字符集。排除的字符组代表任何未列出的字符,并且只能是一个。排除的字符集也支持连字符“-”来表示一个范围。表述描述[abc]指“a”或“b”或“c”;[0-9]表示0到9之间的任意数字,相当于[0123456789][\u4e00-\u9fa5]表示除“a”和“1”以外的任意汉字[a1]。当“[inw]”匹配“Windows 2003”时,匹配成功,匹配结果为“D”。

2.1.3 正则表达式构成

对于一些常用的字符范围,比如数字,非常常见,使用[0-9]这样的字符组还是比较麻烦的,所以定义了一些元字符来表示常见的字符范围。表达式说明\d任意数字相当于[0-9],即0~9中的任意字母、数字或下划线,相当于[a-zA-Z0-9_]\s中的任意空白字符,相当于[\ r \ n \ f \ t \ v] \ d. S为任意非空白字符,且\s为倒排,相当于[\ r \ n \ f \ t \ v]。例如“\w\s\d”与“Windows 2003”匹配时,匹配结果为“s 2”。00-1010小数点可以匹配除“\n”以外的任何字符。如果要匹配包括“\n”在内的所有字符,通常使用[\s\S],或”。“加(?s)匹配模式。表达式描述。匹配除换行符以外的任何字符\ n

2.2 元字符(Meta Character)

Expression Description匹配字符串的起始位置,不匹配任何字符$匹配字符串的结束位置,不匹配任何字符\b匹配单词边界,不匹配任何字符。例如,“a”与“cba”不匹配,因为表达式要求字符“a”跟随起始位置。当“\d$”匹配“123”时,匹配结果为“3”。此表达式要求末尾有匹配的数字。如果结尾不是数字,如“123abc”,则匹配失败。

2.2.1 […] 字符组(Character Classes)

正则化中一些有特殊含义的不可见字符或元字符,如果要匹配字符本身,需要用“\”进行转义。表达式描述\ r \ n回车和换行符\ \匹配“\”本身,\ $,\。下列字符与""、" $ "和" "匹配。“分别通常需要在匹配自己时进行转义。实际上,根据具体情况,需要转义的字符可能会比下面列出的更多。$ {[(|) *?\

2.2.2 常见字符范围缩写

量词表示子表达式可以匹配的次数。

量词可用于修改由()括起来的字符、字符组或子表达式。一些常用的量词被定义为独立的元字符。表达式实例{m}表达式匹配m次" \d{3} "相当于" \ d \ d" "(ABC) {2} "相当于" ABCABC " { m,n}表达式至少匹配m次,最多匹配n次" \d{2,3} "即可匹配。表达式匹配0或1次,相当于{0,1} "ab?".您可以将“a”或“ab”表达式匹配0或任意次数,这相当于{0。}“[] *”中的“[]*”表示0个或任意数量的非“”字符表达式匹配一次或多次,至少匹配一次,相当于{1,}“\ d \ s \ d”。00-1010当字符串的子串有多种可能性时,使用分支结构进行匹配。”“|”表示多个子表达式之间的OR关系,“|”用()定义其范围。如果没有()来定义它在“|”左右两边的范围,它的作用范围就是“|”左右两边的整体。表达式说明|几个子表达式之间“或”关系的一个例子:“AA | b$”匹配“cccb”时可以匹配成功,匹配结果为“B”,因为这个表达式的意思是匹配“AA”或“b$”,而“b$”匹配“cccb”时可以匹配成功。分配“cccb”时,“(aa | b) $”匹配失败,因为这个表达式意味着它只能在“开始”和“结束”之间是“aa”或“b”,但“cccb”显然不满足。00-1010-

2.2.3 . 小数点

捕获组是将正则表达式中子表达式的匹配内容保存到一个用数字命名的组中,或者在内存中手动保存,以备后用。表达式(Expression)普通捕获组,将子表达式表达式的匹配内容保存到数字编号的组(?名称表达式),并将子表达式表达式匹配的内容保存到以名称命名的组中。普通的捕获组(在没有歧义的情况下,简称为捕获组)用数字进行编号,编号规则按照“(”从左到右出现的顺序从1开始编号。通常,编号为0的组代表整个表达式匹配的内容。命名的捕获组可以通过捕获组名称而不是序列号来引用捕获的内容,这提供了一种更方便的引用方法。无需关注捕获组的序列号,也无需担心表达式部分改变的捕获组会导致引用不正确。00-1010在某些表达式中,您必须使用(),但不需要将子表达式的匹配内容保存在()。此时,您可以使用非捕获组来抵消使用()引起的副作用。表达式描述(?Expression),并将匹配内容保存在整个Expression的最终匹配结果中,但Expression的匹配内容不会单独保存在一个组中。

2.2.4 其它元字符

捕获组的匹配内容可以在正则表达式的外部程序中引用,也可以在表达式中引用,表达式中引用的方式为反向引用。反向引用通常用于查找重复的子字符串,或者限制子字符串成对出现。表达式描述\1,\2反向引用序列号为1和2的捕获组\kname反向引用名为name的捕获组示例:“(a|b)\1”与“abaa”匹配成功,匹配结果为“aa”。当“(a|b)”试图匹配时,可以匹配“a”也可以匹配“b”,但反向引用时,对应()中的匹配内容已经固定。00-1010,只匹配子表达式,匹配内容不包含在最终匹配结果中,为零宽度。根据环顾的方向,有两种:顺序和逆序;根据是否匹配,有阳性和阴性两种;综合起来,有四种环顾四周的方式。环顾四周相当于给你的位置增加了一个附加条件。

表达式描述(?=Expression)肯定是倒过来看,说明左边的位置可以匹配Expression(?表达式)负数按相反的顺序环顾四周,表示左边的位置不能匹配表达式(?=Expression)顺序必须左右看,表示右边的位置可以匹配Expression(?Expression)顺序否定环视,表示位置的右侧无法匹配Expression。示例:“(?=Windows )\d“匹配“Windows 2003”时,匹配成功,匹配结果为“2003”。我们知道“\d”意味着匹配多个数字,而“(?=Windows)”相当于一个附加条件,即位置左侧必须是“Windows”,匹配的内容不包含在匹配结果中。当匹配“Office 2003”时,匹配失败,因为这里的任何数字子字符串字符串的左侧都不是“Windows”。"(?1)\d "匹配“123”时,匹配成功,匹配结果为“23”。“\d”匹配多个数字,但附加条件(?1)“要求右侧的位置不能是“1”,所以匹配成功的位置是“2”之前的位置。

2.2.5 转义字符

或正则表达式匹配的贪婪和非贪婪模式。标准量词修饰的子表达式在可以匹配或不匹配时总是试图匹配,这被称为匹配优先或贪婪模式。之前介绍的一些量词,“{m}”、“{m,n}”、“{m,}”和“?”。“*”和“”都是匹配的优先级。一些NFA常规引擎支持忽略优先级量词,即添加“?”在标准量词之后。此时,在可匹配或不匹配的情况下,总是先忽略匹配。只有当忽略优先级量词修改的子表达式必须匹配才能使整个表达式匹配成功时,才会进行匹配,这称为忽略优先级或非贪婪模式。忽略包含“{m}”的优先级量词?“{m,n}?”、“{m,}?”、"?"、"*?"还有“?”。示例:源字符串:divaa/div BBB/div正则表达式1: div。*/div匹配结果:divaa/div BBB/div正则表达式2: div。*?/div匹配结果:divaa/div。

版权声明:正则表达式学习参考推荐初学者是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。