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

    正则表达式是一个描述字符模式的对象。
    JavaScript的RegExp对象和String对象定义了使用正则表达式来执行强大的模式匹配和文本检索与替换函数的方法.

    ''***********************
    '' \JavaScript//
    ''
    ''***********************

    在JavaScript中,正则表达式是由一个RegExp对象表示的.当然,可以使用一个RegExp()构造函数来创建RegExp对象,
    也可以用JavaScript 1.2中的新添加的一个特殊语法来创建RegExp对象.就像字符串直接量被定义为包含在引号内的字符一样,
    正则表达式直接量也被定义为包含在一对斜杠(/)之间的字符.所以,JavaScript可能会包含如下的代码:

    var pattern = /s$/;

    这行代码创建一个新的RegExp对象,并将它赋给变量parttern.这个特殊的RegExp对象和所有以字母"s"结尾的字符串都匹配.用RegExp()也可以定义
    一个等价的正则表达式,代码如下:

    var pattern = new RegExp("s$");

    无论是用正则表达式直接量还是用构造函数RegExp(),创建一个RegExp对象都是比较容易的.较为困难的任务是用正则表达式语法来描述字符的模式.
    JavaScript采用的是Perl语言正则表达式语法的一个相当完整的子集.

    正则表达式的模式规范是由一系列字符构成的.大多数字符(包括所有字母数字字符)描述的都是按照字面意思进行匹配的字符.这样说来,正则表达式/java/就和
    所有包含子串 "java" 的字符串相匹配.虽然正则表达式中的其它字符不是按照字面意思进行匹配的,但它们都具有特殊的意义.正则表达式 /s$/ 包含两个字符.
    第一个特殊字符 "s" 是按照字面意思与自身相匹配.第二个字符 "$" 是一个特殊字符,它所匹配的是字符串的结尾.所以正则表达式 /s$/ 匹配的就是以字母 "s" 结尾
    的字符串.


    1.直接量字符

    我们已经发现了,在正则表达式中所有的字母字符和数字都是按照字面意思与自身相匹配的.JavaScript的正则表达式还通过以反斜杠()开头的转义序列支持某些非

    字母字符.例如,序列 " " 在字符串中匹配的是一个直接量换行符.在正则表达式中,许多标点符号都有特殊的含义.下面是这些字符和它们的含义:

    正则表达式的直接量字符

    字符 匹配
    ________________________________
    字母数字字符 自身
    f 换页符
    n 换行符
    r 回车
    t 制表符
    v 垂直制表符
    / 一个 / 直接量
    一个 直接量
    . 一个 . 直接量
    * 一个 * 直接量
    + 一个 + 直接量
    ? 一个 ? 直接量
    | 一个 | 直接量
    ( 一个 ( 直接量
    ) 一个 ) 直接量
    [ 一个 [ 直接量
    ] 一个 ] 直接量
    { 一个 { 直接量
    } 一个 } 直接量
    XXX 由十进制数 XXX 指 定的ASCII码字符
    Xnn 由十六进制数 nn 指定的ASCII码字符
    cX 控制字符^X. 例如, cI等价于 , cJ等价于

    ___________________________________________________

    如果想在正则表达式中使用特殊的标点符号,必须在它们之前加上一个 "" .


    2.字符类

    将单独的直接符放进中括号内就可以组合成字符类.一个字符类和它所包含的任何一个字符都匹配,所以正则表达式 / [abc] / 和字母 "a" , "b" , "c" 中的任何一个
    都匹配.另外还可以定义否定字符类,这些类匹配的是除那些包含在中括号之内的字符外的所有字符.定义否定字符尖时,要将一个 ^ 符号作为从左中括号算起的第
    一个字符.正则表达式的集合是 / [a-zA-z0-9] / .

    由于某些字符类非常常用,所以JavaScript的正则表达式语法包含一些特殊字符和转义序列来表示这些常用的类.例如, s 匹配的是空格符,制表符和其它空白符, s
    匹配的则是空白符之外的任何字符.

    正则表灰式的字符类

    字符 匹配
    ____________________________________________________
    [...] 位于括号之内的任意字符
    [^...] 不在括号之中的任意字符
    . 除了换行符之外的任意字符,等价于[^ ]
    w 任何单字字符, 等价于[a-zA-Z0-9]
    W 任何非单字字符,等价于[^a-zA-Z0-9]
    s 任何空白符,等价于[ t n r f v]
    S 任何非空白符,等价于[^ t n r f v]
    d 任何数字,等价于[0-9]
    D 除了数字之外的任何字符,等价于[^0-9]
    [] 一个退格直接量(特例)
    ________________________________________________________________

    3.复制

    用以上的正则表式的语法,可以把两位数描述成 / d d /,把四位数描述成 / d d d d /.但我们还没有一种方法可以用来描述具有任意多数位的数字或者是一个

    字符串.这个串由三个字符以及跟随在字母之后的一位数字构成.这些复杂的模式使用的正则表达式语法指定了该表达式中每个元素要重复出现的次数.

    指定复制的字符总是出现在它们所作用的模式后面.由于某种复制类型相当常用.所以有一些特殊的字符专门用于表示它们.例如: +号匹配的就是复制前一模式一次

    或多次的模式.下面的表列出了复制语法.先看一个例子:

    /d{2, 4}/ //匹配2到4间的数字.

    /w{3} d?/ //匹配三个单字字符和一个任意的数字.

    /s+javas+/ //匹配字符串"java" ,并且该串前后可以有一个或多个空格.

    /[^"] * / //匹配零个或多个非引号字符.


    正则表达式的复制字符

    字符 含义
    __________________________________________________________________
    {n, m} 匹配前一项至少n次,但是不能超过m次
    {n, } 匹配前一项n次,或者多次
    {n} 匹配前一项恰好n次
    ? 匹配前一项0次或1次,也就是说前一项是可选的. 等价于 {0, 1}
    + 匹配前一项1次或多次,等价于{1,}
    * 匹配前一项0次或多次.等价于{0,}
    ___________________________________________________________________


    4.选择,分组和引用

    正则表达式的语法还包括指定选择项,对子表达式分组和引用前一子表达式的特殊字符.字符| 用于分隔供选择的字符.例如: /ab|cd|ef/ 匹配的是字符串 "ab",或者是

    字符串 "cd",又或者 "ef". /d{3}|[a-z]{4}/ 匹配的是要么是一个三位数,要么是四个小写字母.在正则表达式中括号具有几种作用.它的主要作用是把单独的项目分组

    成子表达式,以便可以像处理一个独立的单元那种用 *、+或? 来处理那些项目.例如: /java(script) ?/ 匹配的是字符串 "java",其后既可以有 "script",也可以没有. /

    (ab|cd) + |ef) / 匹配的既可以是字符串 "ef",也可以是字符串"ab" 或者 "cd" 的一次或多次重复.

    在正则表达式中,括号的第二个用途是在完整的模式中定义子模式。当一个正则表达式成功地和目标字符串相匹配时,可以从目标串中抽出和括号中的子模式相匹配

    的部分.例如,假定我们正在检索的模式是一个或多个字母后面跟随一位或多位数字,那么我们可以使用模式 / [a-z] + d+/.但是由于假定我们真正关心的是每个匹配

    尾部的数字,那么如果我们将模式的数字部分放在括号中 (/ [a-z] + (d+)/) ,我们就可以从所检索到的任何匹配中抽取数字了,之后我们会对此进行解析的.

    代括号的子表达式的另一个用途是,允许我们在同一正则表达式的后面引用前面的子表达式.这是通过在字符串 后加一位或多位数字来实现的.数字指的是代括号的

    子表达式在正则表达式中的位置.例如: 1 引用的是第一个代括号的子表达式. 3 引用的是第三个代括号的子表达式.注意,由于子表达式可以嵌套在其它子表达式中,

    所以它的位置是被计数的左括号的位置.
    例如:在下面的正则表达式被指定为 2:
    /([Jj]ava([Ss]cript)) sis s (funw*) /


    对正则表达式中前一子表达式的引用所指定的并不是那个子表达式的模式,而是与那个模式相匹配的文本.这样,引用就不只是帮助你输入正则表达式的重复部分的快

    捷方式了,它还实施了一条规约,那就是一个字符串各个分离的部分包含的是完全相同的字符.例如:下面的正则表达式匹配的就是位于单引号或双引号之内的所有字

    符.但是,它要求开始和结束的引号匹配(例如两个都是双引号或者都是单引号):
    /['' "] [^ '' "]*['' "]/


    如果要求开始和结束的引号匹配,我们可以使用如下的引用:
    /( ['' "] ) [^ '' "] * 1/


    1匹配的是第一个代括号的子表达式所匹配的模式.在这个例子中,它实施了一种规约,那就是开始的引号必须和结束的引号相匹配.注意,如果反斜杠后跟随的数字比

    代括号的子表达式数多,那么它就会被解析为一个十进制的转义序列,而不是一个引用.你可以坚持使用完整的三个字符来表示转义序列,这们就可以避免混淆了.例如,

    使用 44,而不是44.下面是正则表达式的选择、分组和引用字符:

    字符 含义
    ____________________________________________________________________
    | 选择.匹配的要么是该符号左边的子表达式,要么它右边的子表达式
    (...) 分组.将几个项目分为一个单元.这个单元可由 *、+、?和|等符号使用,而且还可以记住和这个组匹配的字符以供此后引

    用使用
    和第n个分组所匹配的字符相匹配.分组是括号中的子表达式(可能是嵌套的).分组号是从左到右计数的左括号数
    ____________________________________________________________________

    5.指定匹配的位置

    我们已经看到了,一个正则表达式中的许多元素才能够匹配字符串的一个字符.例如: s 匹配的只是一个空白符.还有一些正则表达式的元素匹配的是字符之间宽度为

    0的空间,而不是实际的字符例如:  匹配的是一个词语的边界,也就是处于一个/w字字符和一个w非字字符之间的边界.像 这样的字符并不指定任何一个匹配了的

    字符串中的字符,它们指定的是匹配所发生的合法位置.有时我们称这些元素为正则表达式的锚.因为它们将模式定位在检索字符串中的一个特定位置.最常用的锚元

    素是 ^, 它使模式依赖于字符串的开头,而锚元素$则使模式定位在字符串的末尾.

    例如:要匹配词 "javascript" ,我们可以使用正则表达式 /^ javascript $/. 如果我们想检索 "java" 这个词自身 (不像在 "javascript" 中那样作为前缀),那么我们可以使

    用模式 /s java s /, 它要求在词语java之前和之后都有空格.但是这样作有两个问题.第一: 如果 "java" 出现在一个字符的开头或者是结尾.该模式就不会与之匹配,除

    非在开头和结尾处有一个空格. 第二: 当这个模式找到一个与之匹配的字符时,它返回的匹配的字符串前端和后端都有空格,这并不是我们想要的.因此,我们使用词语

    的边界  来代替真正的空格符 s 进行匹配. 结果表达式是 / java /.
    下面是正则表达式的锚字符:


    字符 含义
    ____________________________________________________________________
    ^ 匹配的是字符的开头,在多行检索中,匹配的是一行的开头
    $ 匹配的是字符的结尾,在多行检索中,匹配的是一行的结尾
     匹配的是一个词语的边界.简而言之就是位于字符w 和 w之间的位置(注意:[]匹配的是退格符)
    B 匹配的是非词语的边界的字符
    _____________________________________________________________________

    6.属性

    有关正则表达式的语法还有最后一个元素,那就是正则表达式的属性,它说明的是高级模式匹配的规则.和其它正则表达式语法不同,属性是在 / 符号之外说明的.即它

    们不出现在两个斜杠之间,而是位于第二个斜杠之后.javascript 1.2支持两个属性.属性 i 说明模式匹配应该是大小写不敏感的.属性 g 说明模式匹配应该是全局的.也

    就是说,应该找出被检索的字符串中所有的匹配.这两种属性联合起来就可以执行一个全局的,大小写不敏感的匹配.

    例如: 要执行一个大小不敏感的检索以找到词语 "java" (或者是 "java" 、"JAVA"等) 的第一个具体值,我们可以使用大小不敏感的正则表达式 / java/i .如果要在

    一个字符串中找到 "java" 所有的具体值,我们还可以添加属性 g, 即 / java /gi .

    以下是正则表达式的属性:


    字符 含义
    _________________________________________
    i 执行大小写不敏感的匹配
    g 执行一个全局的匹配,简而言之,就是找到所有的匹配,而不是在找到第一个之后就停止了
    _________________________________________

    除属性 g 和 i 之外,正则表达式就没有其它像属性一样的特性了.如果将构造函数 RegExp 的静态属性 multiline 设置为 true ,那么模式匹配将以多行的模式进行.在这

    种模式下,锚字符 ^ 和 $ 匹配的不只是检索字符串的开头和结尾,还匹配检索字符串内部的一行的开头和结尾.例如: 模式 /Java$/ 匹配的是 "Java",但是并不匹配

    "Java is fun" .如果我们设置了 multiline 属性,那么后者也将被匹配:

    RegExp.multiline = true;


    JScript中正则表达函数的说明与应用


    作为模式匹配下文本替换、搜索、提取的强有力工具,正则表达式(Regular Expression)的应用已经从unix平台逐渐渗入到网络开发中了,作为服务器端/客户端的脚本开发语言JScript,正越来越多将正则表达式应用融入其中,以弥补自身在文本上处理能力的不足。在此,我们以JScript5.5版本为例,对其中的正则表达式的应用作一个概述。
    首先我们需要区分JScript中关于正则表达式的两个对象:Regular Expression对象和RegExp对象。
    前者仅包含一个特定的正则表达式实例的信息,而后者通过一个全局变量的属性来反映最近模式匹配的特性。
    前者在匹配前需要指定匹配模式,即创建一个Regular Expression对象的实例,而后可以把它传递给一个字符串方法,或是把一个字符串作为参数传递给这个Regular Expression实例的方法;而后者无需创建,它是一个固有的全局对象,每次成功匹配操作结果信息被保存在这个对象的属性中。

    一、RegExp对象的属性:反应最近一次成功匹配的结果信息

    input :保存执行匹配的字符串(被搜索的目标字符串)(>=IE4)
    index :保存匹配的首字符的位置*>=IE4)
    lastIndex :保存匹配的字符串的下一个字符的位置(>=IE4)
    lastMatch($&) :保存匹配到的字符串(>=IE5.5)
    lastParen($+) :保存匹配结果最后一个子匹配的内容(最后一个括号的匹配内容)(>=IE5.5)
    leftContext($`) :保存目标字符串中匹配子字符串前的所有字符 (>=IE5.5)
    rightContext($'):保存目标字符串中匹配子字符串后的所有字符 (>=IE5.5)
    $1 - $9 :保存匹配中最开始的9个子匹配(即最开始的9个括号内的匹配结果)(>=IE4)

    二、Regular Expression对象简介
    1.Regular Expression对象定义
    在脚本中使用正则表达式模式匹配,首先腰设定匹配模式,方法有如下两种
    (1)rgExp=/pattern*/[flags*]
    (2)rgExp=new RegExp("pattern",["flags"])
    注意:
    a.后者模式中的转义字符“”需要用“\”表示,用以抵消JS中转义字符""的意义,否则JS首先作为自己的转义概念来解释""后的字符。
    b.flags标识有以下几个(至JScript 5.5版本)
    g:设定当前匹配为全局模式
    i:忽略匹配中的大小写检测
    m:多行搜索模式
    2.Regular Expression对象属性
    (1)rgExp.lastIndex:匹配结果后面一个字符的位置,同RegExp.lastIndex
    (2)rgExp.source:reExp对象的正则表达式匹配模式
    3.Regular Expression对象方法
    (1)rgExp.compile(pattern,[flags])
    将rgExp转化为内部格式,以加快匹配的执行,这对于大量模式一致的匹配更有效
    (2)rgExp.exec(str)
    按照rgExp的匹配模式对str字符串进行匹配查找,当rgExp对象中设定了全局搜索模式(g),则匹配查找从RegExp对象lastIndex属性所指定的目标字符串位置开始;若没有设置全局搜索,则从目标字符串第一个字符开始搜索。若没有任何匹配发生,返回null。
    需要注意的是该方法将匹配结果放在一个数组内返回,该数组有三个属性
    input:包含目标字符串,同RegExp.index
    index:匹配到的子字符串在目标字符串中的位置,同RegExp.index
    lastIndex:匹配到的子字符串后面一个字符的位置,同RegExp.lastIndex
    (3)rgExp.test(str)
    返回布尔值来反映被查找的目标字符串str中是否存在符合匹配的模式。该方法不改变RegExp的属性
    4.与正则表达式相关的方法
    主要是指字符串对象中应用模式匹配的方法
    (1)stringObj.match(rgExp)
    根据rgExp对象的正则表达式模式查找字符串stringObj中的匹配字符项,将结果以数组形式返回。该数组有三个属性值,与exec方法返回的数组属性相同。若没有任何匹配,返回null。
    需要注意的是,若rgExp对象未设定全局匹配模式,则数组0下标元素为匹配的整体内容,1~9包含了子匹配得到的字符。若设定了全局模式,则数组包含了搜索到的所有整体匹配项。
    (2)stringObj.replace(rgExp, replaceText)
    返回一个字符串,即将stringObj中符合rgExp模式匹配的字符串替换成replaceText后返回。需要注意的是stringObj本身并不因为替换操作而改变。若期望stringObj中所有符合正则表达式模式的字符串被替换,则在建立正则表达式模式时要设定为全局模式。
    (3)stringObj.search(rgExp)
    返回第一个匹配到的子字符串的位置

    符号名词解释:
    位置:表示子字符串与目标字符串首字符的偏移
    reExp:表示一个Regular Expression对象实例
    stringObj:表示一个字符串对象
    pattern:正则表达式模式
    flags:匹配操作的模式标识

    在实际web程序开发中我们可以有针对性的使用正则表达式来达到我们字符串处理的要求
    如下附上四个使用正则表达式的JScript例程,这些例子主要用来熟悉正则表达式的使用。

    1.email地址有效性检测

    <script language='JScript'>
    function validateEmail(emailStr)
    {
     var re=/^[w.-]+@([0-9a-z][w-]+.)+[a-z]{2,3}$/i;
     //或 var re=new RegExp("^[\w.-]+@([0-9a-z][\w-]+\.)+[a-z]{2,3}$","i");
     if(re.test(emailStr))
     {
      alert("有效email地址!");
      return true;
     }
     else
     {
      alert("无效email地址!");
      return false;
     }
    }
    </script>

    2.字符串替换操作

    <script language='JScript'>
    var r, pattern, re;
    var s = "The rain in Spain falls mainly in the plain falls.";
    pattern = /falls/ig;
    re = s.replace(re,'falling');
    alert('s = ' + s + '
    ' + 're = ' + re);
    </script>


    3.模式查找字符串

    <script language='JScript'>
    var index, pattern;
    var str = "four for fall fell fallen fallsing fall falls waterfalls ";
    pattern = /falls/i;
    index = str.search(pattern);
    alert('The position of match is at ' + index);
    </script>

    3.正则表达式属性例程

    <script language='JScript'>
    function matchAttrib()
    {
       var s=''; 
       var re = new RegExp("d(b+)(d)","ig");
       var str = "cdbBbdbsbdbdz";
       while((arr = re.exec(str))!=null)
       {
        s += "=======================================<br>";
        s += "$1 returns: " + RegExp.$1 + "<br>";
        s += "$2 returns: " + RegExp.$2 + "<br>";
        s += "$3 returns: " + RegExp.$3 + "<br>";
        s += "input returns : " + RegExp.input + "<br>";
        s += "index returns : " + RegExp.index + "<br>";
        s += "lastIndex returns : " + RegExp.lastIndex + "<br>";
        s += "lastMatch returns: " + RegExp.lastMatch + "<br>";
        s += "leftContext returns: " + RegExp.leftContext + "<br>";
        s += "rightContext returns: " + RegExp.rightContext + "<br>"; 
        s += "lastParen returns: " + RegExp.lastParen + "<br>";
        s += "arr.index returns: " + arr.index + "<br>";
        s += "arr.lastIndex returns: " + arr.lastIndex + "<br>";
        s += "arr.input returns: " + arr.input + "<br>";
        s += "re.lastIndex returns: " + re.lastIndex + "<br>";
        s += "re.source returns: " + re.source + "<br>";
       }
       return(s);                            //Return results.
    }
    document.write(matchAttrib());
    </script>
    
     
  • 相关阅读:
    kafka消费者如何才能从头开始消费某个topic的全量数据
    kafka消费者客户端启动之后消费不到消息的原因分析
    JMeter测试工具中的参数化使用[函数助手]
    在IDEA中使用gradle配置打可执行jar包[可执行jar与其所依赖的jar分离]
    一次tomcat配置参数调优Jmeter压力测试记录前后对比
    IntelliJ IDEA 14.1.4导入项目启动报错:Error during artifact deployment.[组件部署期间出错]
    BZOJ2861 : 双向边定向为单向边
    BZOJ4313 : 三维积木
    BZOJ4714 : 旋转排列
    BZOJ1395 : [Baltic2005]Trip
  • 原文地址:https://www.cnblogs.com/spadd/p/4192584.html
Copyright © 2011-2022 走看看