什么是正则表达式? 正则表达式是一种被用于从文本中检索符合某些特定模式的文本。 正则表达式是从左到右来匹配一个字符串的。RegularExpression这个词太长了,我们通常使用它的缩写regex或者regexp。 正则表达式可以被用来替换字符串中的文本、验证表单、基于模式匹配从一个字符串中提取字符串等等。 想象一下,您正在编写应用程序,并且您希望在用户选择用户名时设置规则。我们希望用户名可以包含字母,数字,下划线和连字符。 为了让它看起来不丑,我们还想限制用户名中的字符数量。这时我们可以使用以下正则表达式来验证用户名: 上面这个正则表达式可以匹配johndoe,johndoe和john12as。但是它不能匹配Jo,因为该字符串里面包含大写字符,并且它太短了。1。基本匹配 正则表达式只是我们用于在文本中检索字符串的模式。例如正则表达式cat,表示:字母c后面跟着一个字母a,再后面跟着一个字母t。catThecatsatonthemat 正则表达式123会匹配字符串123。通过将正则表达式中的每个字符逐个与要匹配的字符串中的每个字符进行比较,来完成正则匹配。 正则表达式通常区分大小写,因此正则表达式Cat与字符串cat不匹配。CatThecatsatontheCat2。元字符 元字符是正则表达式的基本组成元素。元字符在这里跟它通常表达的意思不一样,而是以某种特殊的含义去解释。有些元字符在写在方括号内时有特殊含义。 元字符如下: 元字符 描述 。 匹配除换行符以外的任意字符。 〔〕 字符类,匹配方括号中包含的任意字符。 〔〕 否定字符类。匹配方括号中不包含的任意字符 匹配前面的子表达式零次或多次 匹配前面的子表达式一次或多次 ? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。 {n,m} 花括号,匹配前面字符至少n次,但是不超过m次。 (xyz) 字符组,按照确切的顺序匹配字符xyz。 分支结构,匹配符号之前的字符或后面的字符。 转义符,它可以还原元字符原来的含义,允许你匹配保留字符〔〕(){}。? 匹配行的开始 匹配行的结束2。1英文句号 英文句号。是元字符的最简单的例子。元字符。可以匹配任意单个字符。它不会匹配换行符和新行的字符。例如正则表达式。ar,表示:任意字符后面跟着一个字母a, 再后面跟着一个字母r。。arThecarparkedinthegarage。2。2字符集 字符集也称为字符类。方括号被用于指定字符集。使用字符集内的连字符来指定字符范围。方括号内的字符范围的顺序并不重要。 例如正则表达式〔Tt〕he,表示:大写T或小写t,后跟字母h,再后跟字母e。〔Tt〕heThecarparkedinthegarage。 然而,字符集中的英文句号表示它字面的含义。正则表达式ar〔。〕,表示小写字母a,后面跟着一个字母r,再后面跟着一个英文句号。字符。ar〔。〕Agarageisagoodplacetoparkacar。2。2。1否定字符集 一般来说插入字符表示一个字符串的开始,但是当它在方括号内出现时,它会取消字符集。例如正则表达式〔c〕ar,表示:除了字母c以外的任意字符,后面跟着字符a, 再后面跟着一个字母r。〔c〕arThecarparkedinthegarage。2。3重复 以下元字符,或?用于指定子模式可以出现多少次。这些元字符在不同情况下的作用不同。2。3。1星号 星号表示匹配上一个匹配规则零次或多次。正则表达式a表示小写字母a可以重复零次或者多次。但是它如果出现在字符集或者字符类之后,它表示整个字符集的重复。 例如正则表达式〔az〕,表示:一行中可以包含任意数量的小写字母。〔az〕Thecarparkedinthegarage21。 星号可以与元符号。用在一起,用来匹配任意字符串。。星号可以与空格符s一起使用,用来匹配一串空格字符。 例如正则表达式scats,表示:零个或多个空格,后面跟小写字母c,再后面跟小写字母a,再在后面跟小写字母t,后面再跟零个或多个空格。scatsThefatcatsatonthecat。2。3。2加号 加号表示匹配上一个字符一次或多次。例如正则表达式c。t,表示:一个小写字母c,后跟任意数量的字符,后跟小写字母t。c。tThefatcatsatonthemat。2。3。3问号 在正则表达式中,元字符?用来表示前一个字符是可选的。该符号匹配前一个字符零次或一次。 例如正则表达式〔T〕?he,表示:可选的大写字母T,后面跟小写字母h,后跟小写字母e。〔T〕heThecarisparkedinthegarage。〔T〕?heThecarisparkedinthegarage。2。4花括号 在正则表达式中花括号(也被称为量词?)用于指定字符或一组字符可以重复的次数。例如正则表达式〔09〕{2,3},表示:匹配至少2位数字但不超过3位(0到9范围内的字符)。〔09〕{2,3}Thenumberwas9。9997butweroundeditoffto10。0。 我们可以省略第二个数字。例如正则表达式〔09〕{2,},表示:匹配2个或更多个数字。如果我们也删除逗号,则正则表达式〔09〕{2},表示:匹配正好为2位数的数字。〔09〕{2,}Thenumberwas9。9997butweroundeditoffto10。0。〔09〕{2}Thenumberwas9。9997butweroundeditoffto10。0。2。5字符组 字符组是一组写在圆括号内的子模式(。。。)。正如我们在正则表达式中讨论的那样,如果我们把一个量词放在一个字符之后,它会重复前一个字符。 但是,如果我们把量词放在一个字符组之后,它会重复整个字符组。 例如正则表达式(ab)表示匹配零个或多个的字符串ab。我们还可以在字符组中使用元字符。例如正则表达式(cgp)ar,表示:小写字母c、g或p后面跟字母a,后跟字母r。(cgp)arThecarisparkedinthegarage。2。6分支结构 在正则表达式中垂直条用来定义分支结构,分支结构就像多个表达式之间的条件。现在你可能认为这个字符集和分支结构的工作方式一样。 但是字符集和分支结构巨大的区别是字符集只在字符级别上有作用,然而分支结构在表达式级别上依然可以使用。 例如正则表达式(Tt)hecar,表示:匹配大写字母T或小写字母t,后面跟小写字母h,后跟小写字母e,或匹配小写字母c,后跟小写字母a,后跟小写字母r。(Tt)hecarThecarisparkedinthegarage。2。7转义特殊字符 正则表达式中使用反斜杠来转义下一个字符。这将允许你使用保留字符来作为匹配字符{}〔〕。?。在特殊字符前面加,就可以使用它来做匹配字符。 例如正则表达式。是用来匹配除了换行符以外的任意字符。现在要在输入字符串中匹配。字符,正则表达式(fcm)at。?,表示:小写字母f、c或者m后跟小写字母a,后跟小写字母t,后跟可选的。字符。(fcm)at。?Thefatcatsatonthemat。2。8定位符 在正则表达式中,为了检查匹配符号是否是起始符号或结尾符号,我们使用定位符。 定位符有两种类型:第一种类型是检查匹配字符是否是起始字符,第二种类型是,它检查匹配字符是否是输入字符串的最后一个字符。2。8。1插入符号 插入符号符号用于检查匹配字符是否是输入字符串的第一个字符。如果我们使用正则表达式a(如果a是起始符号)匹配字符串abc,它会匹配到a。 但是如果我们使用正则表达式b,它是匹配不到任何东西的,因为在字符串abc中b不是起始字符。 让我们来看看另一个正则表达式(Tt)he,这表示:大写字母T或小写字母t是输入字符串的起始符号,后面跟着小写字母h,后跟小写字母e。(Tt)heThecarisparkedinthegarage。(Tt)heThecarisparkedinthegarage。2。8。2美元符号 美元符号用于检查匹配字符是否是输入字符串的最后一个字符。例如正则表达式(at。),表示:小写字母a,后跟小写字母t,后跟一个。字符,且这个匹配器必须是字符串的结尾。(at。)Thefatcat。sat。onthemat。(at。)34;Thefatcatsatonthemat。3。简写字符集 正则表达式为常用的字符集和常用的正则表达式提供了简写。简写字符集如下: 简写 描述 。 匹配除换行符以外的任意字符 w 匹配所有字母和数字的字符:〔azAZ09〕 W 匹配非字母和数字的字符:〔w〕 d 匹配数字:〔09〕 D 匹配非数字:〔d〕 s 匹配空格符:〔frp{Z}〕 S 匹配非空格符:〔s〕4。断言 后行断言和先行断言有时候被称为断言,它们是特殊类型的非捕获组(用于匹配模式,但不包括在匹配列表中)。当我们在一种特定模式之前或者之后有这种模式时,会优先使用断言。 例如我们想获取输入字符串4。44and10。88中带有前缀的所有数字。我们可以使用这个正则表达式(?)〔09。〕,表示:获取包含。字符且前缀为的所有数字。 以下是正则表达式中使用的断言: 符号 描述 ? 正向先行断言 ?! 负向先行断言 ? 正向后行断言 ? 负向后行断言4。1正向先行断言 正向先行断言认为第一部分的表达式的后面必须是先行断言表达式。返回的匹配结果仅包含与第一部分表达式匹配的文本。 要在一个括号内定义一个正向先行断言,在括号中问号和等号是这样使用的(?。。。)。先行断言表达式写在括号中的等号后面。 例如正则表达式(Tt)he(?sfat),表示:匹配大写字母T或小写字母t,后面跟字母h,后跟字母e。 在括号中,我们定义了正向先行断言,它会引导正则表达式引擎匹配后面跟着fat的The或the。(Tt)he(?sfat)Thefatcatsatonthemat。4。2负向先行断言 当我们需要指定第一部分表达式的后面不跟随某一内容时,使用负向先行断言。负向先行断言的定义跟我们定义的正向先行断言一样, 唯一的区别在于我们使用否定符号!而不是等号,例如(?!。。。)。 我们来看看下面的正则表达式(Tt)he(?!sfat),表示:从输入字符串中获取全部The或者the且不匹配fat前面加上一个空格字符。(Tt)he(?!sfat)Thefatcatsatonthemat。4。3正向后行断言 正向后行断言用于获取跟随在特定模式之后的所有匹配内容。正向后行断言表示为(?。。。)。例如正则表达式(?(Tt)hes)(fatmat),表示:从输入字符串中获取在单词The或the之后的所有fat和mat单词。(?(Tt)hes)(fatmat)Thefatcatsatonthemat。4。4负向后行断言 负向后行断言是用于获取不跟随在特定模式之后的所有匹配的内容。负向后行断言表示为(?。例如正则表达式(?,表示:在输入字符中获取所有不在The或the之后的所有单词cat。(?!(Tt)hes)(cat)Thecatsatoncat。5。标记 标记也称为修饰符,因为它会修改正则表达式的输出。这些标志可以以任意顺序或组合使用,并且是正则表达式的一部分。 标记 描述 i 不区分大小写:将匹配设置为不区分大小写。 g 全局搜索:搜索整个输入字符串中的所有匹配。 m 多行匹配:会匹配输入字符串每一行。5。1不区分大小写 i修饰符用于执行不区分大小写匹配。例如正则表达式Thegi,表示:大写字母T,后跟小写字母h,后跟字母e。 但是在正则匹配结束时i标记会告诉正则表达式引擎忽略这种情况。正如你所看到的,我们还使用了g标记,因为我们要在整个输入字符串中搜索匹配。TheThefatcatsatonthemat。ThegiThefatcatsatonthemat。5。2全局搜索 g修饰符用于执行全局匹配(会查找所有匹配,不会在查找到第一个匹配时就停止)。 例如正则表达式。(at)g,表示:除换行符之外的任意字符,后跟小写字母a,后跟小写字母t。 因为我们在正则表达式的末尾使用了g标记,它会从整个输入字符串中找到每个匹配项。。(at)Thefatcatsatonthemat。。(at)gThefatcatsatonthemat。5。3多行匹配 m修饰符被用来执行多行的匹配。正如我们前面讨论过的(,),使用定位符来检查匹配字符是输入字符串开始或者结束。但是我们希望每一行都使用定位符,所以我们就使用m修饰符。 例如正则表达式at(。)?gm,表示:小写字母a,后跟小写字母t,匹配除了换行符以外任意字符零次或一次。而且因为m标记,现在正则表达式引擎匹配字符串中每一行的末尾。。at(。)?Thefatcatsatonthemat。。at(。)?gmThefatcatsatonthemat。常用正则表达式正整数:d负整数:d电话号码:?〔ds〕{3,}电话代码:?〔ds〕(?〔ds〕{10,}整数:?d用户名:〔wd。〕{4,16}字母数字字符:〔azAZ09〕带空格的字母数字字符:〔azAZ09〕密码:(?。{6,})((?。〔AZaz09〕)(?。〔AZ〕)(?。〔az〕))。电子邮件:(〔azAZ09。〕〔azAZ09。〕。〔azAZ〕{2,4})IPv4地址:((?:(?:25〔05〕2〔04〕〔09〕〔01〕?〔09〕〔09〕?)。){3}(?:25〔05〕2〔04〕〔09〕〔01〕?〔09〕〔09〕?))小写字母:(〔az〕)大写字母:(〔AZ〕)网址:(((httphttpsftp):)?(〔〔azAZ09〕。〕)(。)(〔〔azAZ09〕〕){2,4}(〔〔azAZ09〕。?〕))VISA信用卡号码:(4〔09〕{12}(?:〔09〕{3})?)日期(MMDDYYYY):(0?〔19〕1〔012〕)〔。〕(0?〔19〕〔12〕〔09〕3〔01〕)〔。〕(1920)?〔09〕{2}日期(YYYYMMDD):(1920)?〔09〕{2}〔。〕(0?〔19〕1〔012〕)〔。〕(0?〔19〕〔12〕〔09〕3〔01〕)万事达信用卡号码:(5〔15〕〔09〕{14})