正则表达式

正则表达式基本介绍
  字面量写法
   正则表达式字面量写法,又叫perl写法,因为JavaScript的表达式特性借鉴自perl。正则表达式字面量定义为包含在一堆斜杠/之间的字符,并且可以有三个模式符修正
    g:
     表示全局模式,既模式将被应用于所有字符串,而并非在发现第一个匹配项时立即停止
    i
     表示区分大小写模式,既在确定匹配项时忽略模式与字符串的大小写
    m
     表示多行模式,既在到达一行文本末尾时还会继续查找下一行中是否纯在与模式匹配的项
  RegExp构造函数
   和普通的内置对象一样,RegExp正则表达式对象也支持new RegExp构造函数的形势来创建正则。RegEXP构造函数接受两个参数:要匹配的字符串模式(pattern)和可选的模式修正符(flags)。
  JavaScript的正则中的元字符
   .  点号
    单个任意字符(除回车\r、换行\n、行分隔符\u2028和段分隔符\u2029外)
   [] 字符组
    列出的单个任意字符
   [^] 排除型字符组
    未列出的单个任意字符
   ? 问好
    匹配0次或者1次
   * 星号
    匹配0交或1次
   + 加号
    匹配一次或多次
   {a,b} 区间量词
    匹配至少a次,最多b次;
   ^ 脱字符
    行的起始位置
   $ 美元符
    行的结束位置
   | 竖线
    分隔两边的任意一个表达式
   () 括号
    限制多选结构的范围,标注量词作用的元素,为反向引用捕捉文本
   \1,\2... 反向引用
    匹配之前的第一、第二...组括号内的表达式匹配的文本
  转义字符
   转义字符(escape)表示为反斜线\+字符的形势,共有三种方式
    因为元字符有特殊的含义,所以无法直接匹配。如果要匹配它们本身,则需要在它们前面加上反斜杠\ 但实际上,并非14个字符串都需要转义,右方括号]和右花括号}可以不用写转义字符,写了也不算错
    \加非元字符,表示一些不能打印的特色字符
     \0
      NUL字符\u0000
     [/b]
      匹配退格符\u0008,不要与\b混淆
     \t
      制表符\u0009
     \n
      换行符\u000A
     \v
      垂直制表符\u000B
     \f
      换页符\u000C
     \r
      回车符\u000D
     \xnn
      由十六进制数nn指定的拉丁字符
     \uxxxx
      由十六进制符xxxx指定的Unicode字符(\4e00-\u9fa5代表中文)
     \cX
      控制字符x,表示ctrl-x,其中的x是A-Z之中任一个英文字符,用来匹配控制字符
    \加任意其他字符,默认情况就是匹配此字符,也就是说,反斜线\被忽略了
 局限性
  POSIX字符组(只支持普通字符组和排除型字符组)
  Unicode(只支持单个Unicode字符)
  匹配字符串开始和结尾的\A和\z锚(只支持和$)
  逆序环视(只支持顺序环视)
  命名分组(只支持0-9编号的捕获组)
  单行模式和注释模式(只支持m、i、g)
  模式作用范围
  存文本模式
 优先级
  从上到下,优先级逐渐降低
   \
    转义符
   ( ) (?!) (?=)[ ]
    括号、字符组、环视
   *+?{n} {n,} {n,m}
    量词
   ^$
    起始结束位置
   |
    选择
  由于括号的用途之一就是为量词限定作用范围,所以优先级比量词高
   注意:选择符|的优先级最低,比起始和结束位置都要低
 模式修正符
  i
   默认的,正则表达式是区分大小写的,通过设置标志“i”,可以忽略大小写(ignore case)
  m
   默认地,正则表达式中的^和$匹配的是整个字符串的起始位置和结束位置,而通过设置标志“m”,开启多行模式,它们也能匹配字符串内部某一行文本的起始位置和结束位置
  g
   默认地,第一次匹配成功后,正则对象就停止向下匹配了。g修饰符表示全局匹配,设置“g”标志后,正则对象将匹配全部符合条件的结果,主要用于搜索和替换
 选择相关元字符
  竖线|在正则表达式中表示或(OR)关系选择,以竖线|分隔开的多个子表达式也叫选择分支或选择项。在一个选择结构中,选择分支的数目没有限制。
在选择结构中,竖线|用来分隔选择项,而括号()用来规定整个选择结构的范围。如果没有出现括号,则将整个表达式视为一个选择结构
选择项的尝试匹配次序是从左到右,知道发现了匹配项,如果某个选择项匹配就忽略右侧其他选择项,如果所有子选择项都不匹配,则整个选择结构匹配失败
  在选择结构中,应该尽量避免选择分支中存在重复匹配,因为这样会大大增加回溯的计算量
 括号相关元字符
  分组
   量词控制之前元素的出现次数,而这个元素可能是一个字符,也可能是一个字符组也可以是一个表达式。如果把一个表达式用括号包围起来,这个元素就是括号里的表达式,被称为子表达式,如果希望字符串“ab”重复出现2次,应该写为(ab){2},而如果写为ab{2},则{2}只限定b
   身份证长度有15位和18位两种,如果只匹配长度,可能会想当然的写成\d{15,18},实际上这是错误的,因为它包括15、16、17、18这四种长度。
  捕获
   括号不仅可以对元素进行分组,还会保存没个分组匹配的文本,等到匹配完成后,引用捕获的内容。因为捕获了文本,这种功能叫捕获分组,比如,要匹配诸如2016-06-23这样的日期字符串
   与以往不同的是,年。月。日这三个数值被括号括起来了,从左到右为第一个括号、第二个括号和第三个括号,分别代表第1、2、3个捕获组。ES有9个作用于储存捕获组的构造函数,如果使用的是test()方法,那么通过正则对象的$1-$9属性可以访问到
    再例如
   而exec()方法是专门为捕获组而设计的,返回的数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串,如果要获取,那么可以通过指定数组的下标来进行获取
   捕获分组捕获的文本,不仅可以用于数据提取,也可以用于替换字符串的replace()方法就是用于进行数据替换的,该方法接受两个参数,第一个参数为待查找的内容,而第二个参数为替换的内容
   注意这里书写正则表达式的时候必须要写上模式修正符g,这样才能够进行全局匹配。在replace()方法中也可以引用分组,形式还是用$num,其中num是对应分组的编号
 量词相关元字符
  根据字符组的介绍,可以用字符组【0-9】或\d来匹配单个数字字符,如果用正则表达式更复杂的字符串,则不太方便
  正则表达式提供了量词,用来设定某个模式出现的次数
   {n}
    匹配n次
   {n,m}
    匹配至少n次,最多m次
   {n,}
    匹配至少n次
   ?
    相当于{0,1}
   *
    相当于{0,}
   +
    相当于{1,}
  美国英语和英国英语有些词的写法不一样,如果traveler和traveller,favor和favour,color和colour
  协议名有http和https两种
   /https?/;
  贪婪模式
   默认情况下,量词都是贪婪模式,既匹配到下一个字符不满足匹配规则为止
    这里我们使用了正则表达式的另外一个常用的实挒方法。该方法会返回一个数组,数组里面有匹配上的字符,匹配上的索引值以及原始的字符串等更加详细的信息
  懒惰模式
   懒惰模式和贪婪模式相对应,在量词后加问号?表示,表示尽可能少的匹配,一旦条件满足就再不往下匹配
 字符组相关元字符
  字符组介绍
   字符组,有的翻译成字符类或字符集。简单而言,就是指用方括号表示的一组字符,它匹配若干字符之一
   注意:字符组中的字符裴烈顺序并不影响字符组的功能,出现重复字符不会影响
  范围
   正则表达式通过连字符-提供了范围表示法,可以简化字符组
   连字符-表示的范围是根据ASCll编码的码值来确定的,码值小的在前,码值大的在后,所以[0-9]是合法的,而[9-0]会报错
   在字符组中可以同时并列多个-范围
   只有在字符组内部,连字符-才是元字符,表示一个范围,否则它就只能匹配普通的连字符号。注意:如果连字符出现在字符组的开头或末尾,它表示的也是普通的连字符号,而不是一个范围
  排除
   字符组的另一个类型是排除型字符组,在左方括号后紧跟一个脱字符^表示,表示在当前位置匹配一个没有列出的字符,所以[^0-9]表示0-9以外的字符
    注意:在字符组内部,脱字符^表示排除,而在字符组外部,脱字符^表示一个行锚点^符号是元字符,在字符组中只要^符号不挨着左方括号就可以表示其本身含义,不转义也可以
   在字符组中,只有^-[]这4个字符可能被当做元字符,其他有元字符都只能表示其本身
  简记
   用[0-9]、[a-z]等字符组,可以很方便的表示数字字符和小写字母字符。对于这类常用字符组,正则表达式提供了更简单的记法,这就是字符组简记
   常见的字符组简记有\d、\w、\s。其中d表示数字,w表示单词,s表示空白
   正则表达式也提供了对应排除型字符组的 简记法\D、\W、\S。字母完全相同,只是改为大写。它们和小写的简记符在含义上刚好相反
    \d
     数字,等同于【0-9】
    \D
     非数字,等同于【^0-9】
    \s
     等同于【^\f\n\r\t\u000B\u0020\u00A0 \u2028\u2029]
    \S
     非空白字符,等同于[^\f\n\r\t\u000B\u0020\u00A0\u2028\u2029]
    \w
     字母、数字、下划线,等同于[0-9A-Za-z_](汉字不属于\w)
    \W
     非字母、数字、下划线,等同于ᶋ 0-9A-Za-z_]
  任意字符
   经常有人有一个误区就是认为点可以代表任意字符,其实并不是。点号.代表除回车(\r),换行(\n),行分隔符(\u2028)和段分隔符(\u2029)以外的任意字符。
   妥善的利用互补属性,可以得到一些巧妙的效果。比如,[\s\S]、[\w\W]、[\d\D]都可以表示任意字符

正则表达式
 正则表达式基本介绍
  字面量写法
   正则表达式字面量写法,又叫perl写法,因为JavaScript的表达式特性借鉴自perl。正则表达式字面量定义为包含在一堆斜杠/之间的字符,并且可以有三个模式符修正
    g:
     表示全局模式,既模式将被应用于所有字符串,而并非在发现第一个匹配项时立即停止
    i
     表示区分大小写模式,既在确定匹配项时忽略模式与字符串的大小写
    m
     表示多行模式,既在到达一行文本末尾时还会继续查找下一行中是否纯在与模式匹配的项
  RegExp构造函数
   和普通的内置对象一样,RegExp正则表达式对象也支持new RegExp构造函数的形势来创建正则。RegEXP构造函数接受两个参数:要匹配的字符串模式(pattern)和可选的模式修正符(flags)。
  JavaScript的正则中的元字符
   .  点号
    单个任意字符(除回车\r、换行\n、行分隔符\u2028和段分隔符\u2029外)
   [] 字符组
    列出的单个任意字符
   [^] 排除型字符组
    未列出的单个任意字符
   ? 问好
    匹配0次或者1次
   * 星号
    匹配0交或1次
   + 加号
    匹配一次或多次
   {a,b} 区间量词
    匹配至少a次,最多b次;
   ^ 脱字符
    行的起始位置
   $ 美元符
    行的结束位置
   | 竖线
    分隔两边的任意一个表达式
   () 括号
    限制多选结构的范围,标注量词作用的元素,为反向引用捕捉文本
   \1,\2... 反向引用
    匹配之前的第一、第二...组括号内的表达式匹配的文本
  转义字符
   转义字符(escape)表示为反斜线\+字符的形势,共有三种方式
    因为元字符有特殊的含义,所以无法直接匹配。如果要匹配它们本身,则需要在它们前面加上反斜杠\ 但实际上,并非14个字符串都需要转义,右方括号]和右花括号}可以不用写转义字符,写了也不算错
    \加非元字符,表示一些不能打印的特色字符
     \0
      NUL字符\u0000
     [/b]
      匹配退格符\u0008,不要与\b混淆
     \t
      制表符\u0009
     \n
      换行符\u000A
     \v
      垂直制表符\u000B
     \f
      换页符\u000C
     \r
      回车符\u000D
     \xnn
      由十六进制数nn指定的拉丁字符
     \uxxxx
      由十六进制符xxxx指定的Unicode字符(\4e00-\u9fa5代表中文)
     \cX
      控制字符x,表示ctrl-x,其中的x是A-Z之中任一个英文字符,用来匹配控制字符
    \加任意其他字符,默认情况就是匹配此字符,也就是说,反斜线\被忽略了
 局限性
  POSIX字符组(只支持普通字符组和排除型字符组)
  Unicode(只支持单个Unicode字符)
  匹配字符串开始和结尾的\A和\z锚(只支持和$)
  逆序环视(只支持顺序环视)
  命名分组(只支持0-9编号的捕获组)
  单行模式和注释模式(只支持m、i、g)
  模式作用范围
  存文本模式
 优先级
  从上到下,优先级逐渐降低
   \
    转义符
   ( ) (?!) (?=)[ ]
    括号、字符组、环视
   *+?{n} {n,} {n,m}
    量词
   ^$
    起始结束位置
   |
    选择
  由于括号的用途之一就是为量词限定作用范围,所以优先级比量词高
   注意:选择符|的优先级最低,比起始和结束位置都要低
 模式修正符
  i
   默认的,正则表达式是区分大小写的,通过设置标志“i”,可以忽略大小写(ignore case)
  m
   默认地,正则表达式中的^和$匹配的是整个字符串的起始位置和结束位置,而通过设置标志“m”,开启多行模式,它们也能匹配字符串内部某一行文本的起始位置和结束位置
  g
   默认地,第一次匹配成功后,正则对象就停止向下匹配了。g修饰符表示全局匹配,设置“g”标志后,正则对象将匹配全部符合条件的结果,主要用于搜索和替换
 选择相关元字符
  竖线|在正则表达式中表示或(OR)关系选择,以竖线|分隔开的多个子表达式也叫选择分支或选择项。在一个选择结构中,选择分支的数目没有限制。
在选择结构中,竖线|用来分隔选择项,而括号()用来规定整个选择结构的范围。如果没有出现括号,则将整个表达式视为一个选择结构
选择项的尝试匹配次序是从左到右,知道发现了匹配项,如果某个选择项匹配就忽略右侧其他选择项,如果所有子选择项都不匹配,则整个选择结构匹配失败
  在选择结构中,应该尽量避免选择分支中存在重复匹配,因为这样会大大增加回溯的计算量
 括号相关元字符
  分组
   量词控制之前元素的出现次数,而这个元素可能是一个字符,也可能是一个字符组也可以是一个表达式。如果把一个表达式用括号包围起来,这个元素就是括号里的表达式,被称为子表达式,如果希望字符串“ab”重复出现2次,应该写为(ab){2},而如果写为ab{2},则{2}只限定b
   身份证长度有15位和18位两种,如果只匹配长度,可能会想当然的写成\d{15,18},实际上这是错误的,因为它包括15、16、17、18这四种长度。
  捕获
   括号不仅可以对元素进行分组,还会保存没个分组匹配的文本,等到匹配完成后,引用捕获的内容。因为捕获了文本,这种功能叫捕获分组,比如,要匹配诸如2016-06-23这样的日期字符串
   与以往不同的是,年。月。日这三个数值被括号括起来了,从左到右为第一个括号、第二个括号和第三个括号,分别代表第1、2、3个捕获组。ES有9个作用于储存捕获组的构造函数,如果使用的是test()方法,那么通过正则对象的$1-$9属性可以访问到
    再例如
   而exec()方法是专门为捕获组而设计的,返回的数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串,如果要获取,那么可以通过指定数组的下标来进行获取
   捕获分组捕获的文本,不仅可以用于数据提取,也可以用于替换字符串的replace()方法就是用于进行数据替换的,该方法接受两个参数,第一个参数为待查找的内容,而第二个参数为替换的内容
   注意这里书写正则表达式的时候必须要写上模式修正符g,这样才能够进行全局匹配。在replace()方法中也可以引用分组,形式还是用$num,其中num是对应分组的编号
 量词相关元字符
  根据字符组的介绍,可以用字符组【0-9】或\d来匹配单个数字字符,如果用正则表达式更复杂的字符串,则不太方便
  正则表达式提供了量词,用来设定某个模式出现的次数
   {n}
    匹配n次
   {n,m}
    匹配至少n次,最多m次
   {n,}
    匹配至少n次
   ?
    相当于{0,1}
   *
    相当于{0,}
   +
    相当于{1,}
  美国英语和英国英语有些词的写法不一样,如果traveler和traveller,favor和favour,color和colour
  协议名有http和https两种
   /https?/;
  贪婪模式
   默认情况下,量词都是贪婪模式,既匹配到下一个字符不满足匹配规则为止
    这里我们使用了正则表达式的另外一个常用的实挒方法。该方法会返回一个数组,数组里面有匹配上的字符,匹配上的索引值以及原始的字符串等更加详细的信息
  懒惰模式
   懒惰模式和贪婪模式相对应,在量词后加问号?表示,表示尽可能少的匹配,一旦条件满足就再不往下匹配
 字符组相关元字符
  字符组介绍
   字符组,有的翻译成字符类或字符集。简单而言,就是指用方括号表示的一组字符,它匹配若干字符之一
   注意:字符组中的字符裴烈顺序并不影响字符组的功能,出现重复字符不会影响
  范围
   正则表达式通过连字符-提供了范围表示法,可以简化字符组
   连字符-表示的范围是根据ASCll编码的码值来确定的,码值小的在前,码值大的在后,所以[0-9]是合法的,而[9-0]会报错
   在字符组中可以同时并列多个-范围
   只有在字符组内部,连字符-才是元字符,表示一个范围,否则它就只能匹配普通的连字符号。注意:如果连字符出现在字符组的开头或末尾,它表示的也是普通的连字符号,而不是一个范围
  排除
   字符组的另一个类型是排除型字符组,在左方括号后紧跟一个脱字符^表示,表示在当前位置匹配一个没有列出的字符,所以[^0-9]表示0-9以外的字符
    注意:在字符组内部,脱字符^表示排除,而在字符组外部,脱字符^表示一个行锚点^符号是元字符,在字符组中只要^符号不挨着左方括号就可以表示其本身含义,不转义也可以
   在字符组中,只有^-[]这4个字符可能被当做元字符,其他有元字符都只能表示其本身
  简记
   用[0-9]、[a-z]等字符组,可以很方便的表示数字字符和小写字母字符。对于这类常用字符组,正则表达式提供了更简单的记法,这就是字符组简记
   常见的字符组简记有\d、\w、\s。其中d表示数字,w表示单词,s表示空白
   正则表达式也提供了对应排除型字符组的 简记法\D、\W、\S。字母完全相同,只是改为大写。它们和小写的简记符在含义上刚好相反
    \d
     数字,等同于【0-9】
    \D
     非数字,等同于【^0-9】
    \s
     等同于【^\f\n\r\t\u000B\u0020\u00A0 \u2028\u2029]
    \S
     非空白字符,等同于[^\f\n\r\t\u000B\u0020\u00A0\u2028\u2029]
    \w
     字母、数字、下划线,等同于[0-9A-Za-z_](汉字不属于\w)
    \W
     非字母、数字、下划线,等同于ᶋ 0-9A-Za-z_]
  任意字符
   经常有人有一个误区就是认为点可以代表任意字符,其实并不是。点号.代表除回车(\r),换行(\n),行分隔符(\u2028)和段分隔符(\u2029)以外的任意字符。
   妥善的利用互补属性,可以得到一些巧妙的效果。比如,[\s\S]、[\w\W]、[\d\D]都可以表示任意字符

posted @ 2019-07-21 22:49  渡己~w  阅读(310)  评论(0编辑  收藏  举报