一、概述

正则表达式是一种表达文本模式的方法。我们通常会定义一个正则表达式规则,然后用这个规则来对一些字符串进行匹配。比如我们定义了一个表示邮件地址的正则表达式,然后我们使用这个正则表达式对用户输入的字符串进行匹配,看这个字符串是不是一个邮件地址。

二、字面量字符与元字符

组成正则表达式字符串的所有字符被分为两类:字面量字符与元字符。

  • 字面量字符:它就表示字符的字面量,比如正则表达式a就匹配字符串a。正则比表达式abcb就匹配字符串abcb,这些字符没有代表什么特殊的含义。
  • 元字符:这些字符不匹配他们字面量本身,他们有特殊的含义。如正则表达式中点号.意思并不是匹配字符.,而是匹配所有除换换行符外的所有字符。如果要匹配元字符的字面量字符,则需要使用转移符\对这个元字符转义。如\.就会匹配字符.而不是除换行符外的所有字符。

正则表达式中的元字符有: .\?+*()[]{}^$|-等。

三、元字符详解

  • .:表示匹配除换行符外的所有字符。
  • \:表示转义,如果要匹配元字符中有特殊含义的字符,则要使用转义。
  • ?:表示前面的一个模式出现0次或1次。
  • +:表示前面的一个模式出现1次或多次。
  • *:表示前面的一个模式出现0次或多次。
  • ():表示组匹配。比如abc+可以匹配字符串abcc。因为这里对于+来说他前面的模式就是c,那么c+表示有一个或者多个c,因此abcabccabccc都可以。但是如果我们想让+作用于abc呢,那么可以使用组匹配()abc作为一个组:(abc)+。这样就会匹配abcabc或者abcabcabc等等了。
    • 如果想匹配但是不获取这个组那么使用(?:)。如(?:abc);
  • []:表示匹配的字符的集合,注意三种用法:
    • [abc]:表示匹配字面量abc
    • 可以使用连字符,[a-c]:也是表示匹配abc
    • 可以使用脱字符^[^abc]: 表示匹配除abc之外的其他字符。
  • {}:表示前面的一个模式重复的次数。
    • abc{5}:表示它前面的一个模式c出现的次数是5次。
    • abc{2,5}:表示它前面的一个模式c出现的次数是2到5次(注意逗号之间不能有空格)。
    • (abc){5}:表示它前面的模式abc出现的次数是5次。
    • (abc){2,5}:表示它前面的模式abc出现的次数是2到5次。
  • ^:有两种不同的用法:
    • ^在元字符[]里。如果是第一个字符,那么表示匹配除了中括号里面的字符外其他字符。如果不是,那么表示匹配字面量^
    • 如果^不在元字符[]里面,那么他只能在整个正则表达式的开头,表示匹配由^后面接的第一个模式开头的字符串。
  • $:表示正则的末尾。
  • |:表示或。
  • -:在元字符[]里面表示范围,如果不在这个元字符里面那么表示字面量-

三、预定义模式

预定义模式是一些常见模式的简写方式。

  • \d 匹配一个0-9之间的任意数字,相当于[0-9]
  • \D 匹配一个所有0-9以外的字符,相当于[^0-9]
  • \w 匹配一个任意的字母或数字或下划线,相当于[A-Za-z0-9_]
  • \W 匹配一个除所有字母和数字和下划线以外的字符,相当于[^A-Za-z0-9_]
  • \s 匹配一个空格(包括换行符、制表符、空格符等),相等于[ \t\r\n\v\f]
  • \S 匹配一个非空格的字符,相当于[^ \t\r\n\v\f]
  • \b 匹配词的边界。
  • \B 匹配非词边界,即在词的内部。

四、贪婪模式

对于用来设定某个模式出现的次数的三个量词元字符?+*,默认情况下他们的匹配规则是最大可能匹配,也就是说他们会匹配到下一个字符不满足匹配规则为止。这个种匹配规则被称为贪婪模式。