zoukankan      html  css  js  c++  java
  • js正则表达式

    1.正则表达式的定义

    var pattern = new RegExp('xyz', i)
    var pattern = /xyz/i
    var pattern = new RegExp(/xyz/i)
    var pattern = new RegExp(/xyz/ig,i) //这个只有ES6支持,后面的修饰符会覆盖前面的

    2.直接量字符

    按照字面含义进行匹配的字符。具有特殊含义的标点符号用反斜杠()进行转义。

    3.字符类

    将直接量字符串放在方括号内就组成了字符类(character class)。一个字符类可以匹配它包含的任意字符。

    可以通过"^"符号来定义否定字符类,匹配所有不包含在方括号内的字符。

    字符类可以使用连字符来表示字符范围。例如:/[a-z]/。

    表3:正则表达式的字符类

    字符  匹配

    [...]   方括号内的任意字符

    [^...]  不在方括号内的任意字符

    .    除换行符和其它Unicode行终止符之外的任意字符

    w    任何ASCII字符组成的单词,等价于[a-zA-Z0-9]

    W   任何不是ASCII字符组成的单词,等价于[^a-zA-Z0-9]

    s    任何Unicode空白符

    S   任何非Unicode空白符

    d   任何ASCII数字,等价于[0-9]

    D   任何非ASCII数字,等价于[^0-9]

    []  直接退格量(特例)

    4.重复

    在正则模式之后跟随用以指定字符重复的标记。

    表4:正则表达式的重复字符语法

    字符    含义

    {n, m}  匹配前一项至少n次,但不能超过m次

    {n, }     匹配前一项n次或者更多次

    {n}       匹配前一项n次

    ?    匹配前一项0次或者1次,等价于{0, 1}

    +    匹配前一项1次或者多次,等价于{1, }

    *     匹配前一项0次或者多次,等价于{0, }

    非贪婪的重复=》在匹配字符后面加一个问号。

    5.选择、分组和引用

    选择:

    字符"|"用于分割被选择的字符。

    注意:选择项的尝试匹配次序是从左到右。如果左边的选择项匹配,就忽略右边的匹配项,即使它产生更好的匹配

    例如:/a|ab/匹配字符串ab时,只匹配第一个字符a。

    分组:

    正则表达式圆括号的作用:

    (1)把单独的项组合成表达式。

    (2)在完整的模式中定义子模式。当一个正则表达式成功的和目标字符串相匹配时,可以从目标串中抽出和圆括号中的子模式相匹配的部分

    (3)允许同一表达式的后部,引用前面的子表达式。例如:1引用的是第一个带圆括号的子表达式。子表达式的位置实际是参与计数的左括号的位置

    对正则表达式中的前面子表达式的引用,并不是指对子表达式的模式的引用,而指的是那个模式相匹配的文本的引用

    可以用(?...)组成没有引用的分组。

    表5:正则表达式的选择、分组和引用字符

    字符  含义

    |     选择,匹配该符号左边或者右边的表达式

    (...)   组合,将几个项组合成一个单元,且这个单元可以产生一个引用。

    (?...)   只组合,把项组合成一个单元,但不记忆与该组相匹配的字符。

         和第n个分组第一次匹配的字符相匹配,组索引是从左到右的左括号数。

    6.指定匹配位置

    表6:正则表达式中的锚字符

    字符   含义

    ^    匹配字符串的开头,在多行检索中,匹配一行的开头。

    $      匹配字符串的结尾,在多行检索中,匹配一行的结尾。

         匹配一个单词的边界。

    B     匹配非单词边界的位置。

    Q(?=p)  零宽正向先行断言,要求Q后面的字符都与p相匹配,但不能包括匹配p的那些字符。(断言不计入返回结果)

    Q(?!p)   零宽负向先行断言,要求Q后面的字符不与p匹配。

    (?<=p)Q  零宽正向后行断言,要求Q前面的字符与p相匹配。

    (?<!p)Q  零宽负向后行断言,要求Q前面的字符不与p相匹配。

    7.修饰符

    表7:正则表达式修饰符

    字符   含义

    i    执行不区分大小写的匹配/

    g     执行一个全局匹配,即找到所有的匹配,而不是在找到第一个后就停止。

    m    多行匹配模式,^匹配一行的开头和字符串的开头,$匹配行的结束和字符串的结束。

    u    "Unicode"模式,用来处理大于uFFFF的Unicode字符。

    y    与g修饰符类似,但是必须确保匹配从剩余字符串的第一个位置开始。(也叫做粘连sticky修饰符)

    s   可以使.匹配任意单个字符(不加s的话.只能匹配除换行符和其它Unicode行终止符之外的任意字符),等价于[^]

    8.用于模式匹配的String方法

    String支持4种使用正则表达式的方法。

    (1)search

    参数是一个正则表达式。返回第一个与正则表达式匹配的子串的起始位置。如果找不到匹配的子串,它将返回-1。

    search不支持全局搜索,会忽略正则表达式中的修饰符g。如果参数是字符串,则会首先转换为正则表达式。

    (2)replace

    第一个参数是正则表达式,第二个参数是要进行替换的字符串。

    如果正则表达式中设置了全局修饰符g,则源字符串中的所有匹配的子串都将会被替换。如果没有设置修饰符g,则只替换所匹配的第一个子串。如果第一个参数是字符串,则会直接搜索,而不会转换为正则表达式。

    替换字符串中出现$加数字,那么repalce将会用与指定的子表达式相匹配的文本来替换这两个字符。

    例如:用中文半角引号来替换英文引号,并保持引号里面的内容不变

    var reg = /"([^"]*)"/g
    text.replace(reg, “$1”)

    repalce方法的第二个参数可以是一个函数,可以动态的计算替换字符串。

    (3)match

    参数是一个正则表达式。返回一个由匹配结果组成的数组。如果正则表达式设置了全局修饰符g,则返回包含了所有匹配结果的数组。如果没有设置修饰符g,也会返回一个数组,数组的第一个元素是匹配的字符串,余下的元素是正则表达式用圆括号括起来的子表达式

    a[n]存放的是$n的内容。此外返回数组还带有index和input属性。

    (4)split

    参数是一个正则表达式。返回用正则表达式分隔符分割字符串的子串数组。

    9.RegExp对象

    RegExp的属性:

    (1)source:(String)正则表达式的文本。

    (2)global:(Boolean)正则表达式是否包含修饰符g。只读。

    (3)ignoreCase:(Boolean)正则表达式是否包含修饰符i。只读。

    (4)multiline:(Boolean)正则表达式是否包含修饰符m。只读。

    (5)lastIndex:(Number)整数,如果匹配模式带有g修饰符,存储字符串下一次检索的位置。读/写。

    RegExp方法:

    (1)exec()

    参数是一个字符串。返回相同的数组(与match返回结果类似,但有修饰符g时不同)。如果正则表达式由修饰符g,则可以重复调用,从lastIndex位置开始检索。

    (2)test()

    参数是一个字符串。返回一个布尔值。

    10.具名组匹配

    (?<name>...)为每个引用指定一个名字。

    可以在exec方法返回结果的groups属性上引用该组名

    例如:

    const re_date = /(?<year>d{4})-(?<month>d{2})-(?<day>d{2})/
    const res = re_date.exec('1900-10-12')
    const year = res.groups.year // 1900
    const month = res.groups.month // 10
    const day = res.groups.day // 12
  • 相关阅读:
    (4)ES6解构赋值-字符串篇
    (3)ES6解构赋值-对象篇
    (2)ES6解构赋值-数组篇
    (1)ES6中let,const,对象冻结,跨模块常量,新增的全局对象介绍
    MySQL中char与varchar区别,varchar最大长度是多少?
    集成学习实战——Boosting(GBDT,Adaboost,XGBoost)
    集成学习——Boosting(GBDT,Adaboost,XGBoost)
    集成学习(Random Forest)——实践
    集成学习——Bagging
    决策树实践
  • 原文地址:https://www.cnblogs.com/zhoulixue/p/8877497.html
Copyright © 2011-2022 走看看