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

    1. [代码][JavaScript]代码     
    参考自《Core JavaScript Reference 1.5》


       JavaScript正则表达式有两种写法(随便哪种,看个人习惯):
       字面常量写法格式 /pattern/[flags],如/^d{3}$/g
       RegExp对象实例化 new RegExp("pattern" [, "flags"]),如new RegExp("\w+", "m")
       flags可以取g(全局匹配)、i(匹配时忽略大小写)、m(可跨多行进行匹配)。


       下面提几个JavaScript正则匹配中的特殊字符:
       .      匹配除了换行符以外的任意单个字符
            匹配单词边界,注意单词边界不仅可以是空格,字符串开头或结尾也是单词边界,所以:
                var reg = /.n/;
                reg.test("on"); // true
       []   匹配回车,不要把它跟混淆
       (x)    匹配'x'字符并且记住匹配),即捕获。例如 /(foo)/ 记主 "foo bar" 中的 "foo" ,并且匹配的子字符串"foo",可以通过结果数组以索引方式取得[1],[2]...[n](注意是从1开始),或者从RegExp对象的$1,...,$9
    属性取得
       (?:x)  非捕获匹配。匹配'x'但不记住这个匹配。
       x(?=y) 正向预搜索,匹配'x'仅当'x'后面紧跟'y'。例如 /Jack(?=Sprat|Frost)/ 匹配'Jack'仅当它后面紧跟'Sprat’或者'Frost'。但是'Sprat'和'Frost'不包含在匹配结果中
       x(?!y) 也是正向预搜索,匹配'x'仅当'x'后面不紧跟'y'。如 /d+(?!.)/匹配一个数字仅当它后面不紧跟小数
    点字符,所以 /d+(?!.)/.exec("3.1415926") 匹配 "1415926",但是不匹配 "3.1415926"
       f     匹配一个表单换行(form-feed)
            匹配换行
            匹配一个carriage return
       s     匹配单个空白字符,包括空格、tab、表单换行、 ,等价于[ f u00A0u2028u2029]
       S     匹配不是空白字符的单个字符,等价于[^ f u00A0u2028u2029]
            匹配tab
       v     匹配垂直tab


       接下来提下RegExp对象的属性:
       global     是否全局匹配,返回true和false(布尔型),比如/w/g.global返回true
       ignoreCase 举一反一
       multiline  举一反一++
       lastIndex  标识下次匹配从哪里开始
       source     匹配正则的文本表示(字符串),比如/w/g.source返回 "w",后面的匹配修饰字符会被省略


       最后是重点,RegExp对象的方法,也即我们常用的exec和test。
       
       先讲exec方法,语法是 regexp.exec([str])
         该方法返回的是一个类似数组的对象(我不确定究竟是不是数组)。
         var myRe = /d(b+)(d)/ig;
         var myArray= myRe.exec("cdbBdbsbz");
         在Chrome控制台下myArray为["dbBd", "bB", "d"]
         myArray的属性提供了另外一些信息:
            index 返回最近这次匹配在整个字符串中的索引(从0开始),这里为1
            input 返回原始待匹配字符串,这里为"cdbBdbsbz"
            [0]   即myArray[0],返回最近一次匹配的字符串,这里为dbBd。注意是完整匹配
            [1]   返回完整匹配字符串中的括号中捕获的字符串,按照先后顺序,myArray[1]表示(b+)捕获的字
    符串,这里为"bB"。同理myArray[2]表示(d)捕获的字符串,这里为"d"。myArray[n]...n没有上限
         myRe的属性也有一些信息:网站源码
            lastIndex   返回下次匹配的开始位置(0 index based),这里为5,即下次从s开始
            ignoreCase、multiline、source上面已经说过了,就不啰嗦了
         exec方法可以像下面这样多次使用,表示持续匹配(这个词可能不准确),想想lastIndex,比如下面:
            var myRe = /ab*/g;
            var str = "abbcdefabh";
            myArray = myRe.exec(str);
            console.log("第一次匹配到:" + myArray[0] + ",下次匹配从index " + myRe.lastIndex + "开始");
            myArray2 = myRe.exec(str);
            console.log("第二次匹配到:" + myArray[0] + ",下次匹配从index " + myRe.lastIndex + "开始");
            输出为:http://www.huiyi8.com/webyuanma/
            第一次匹配到:abb,下次匹配从index 3开始
            第二次匹配到:abb,下次匹配从index 9开始
       
       再讲下test方法,这个方法很简单,直接上实例:
            var myRe = /w+/g;
            if(myRe.test("abc")) {
               alert("hello");
            }


       已经讲得够多了,但是我觉得还是得提下字符串的replace方法,就一个小例子:
        var re = /(w+)s(w+)/;
        str = "John Smith";
        newStr = str.replace(re, "$2, $1");// 结果为 Smith, John


       顺带提下,JavaScript不支持反向预搜索,但这里顺带提下反向预搜索:
       反向预搜索也包括两种 (?<=y)x 和 (?<!y)x,前者表示匹配字符'x’仅当它前面紧跟'y'。后者表示匹配字符'x'仅当它前面不紧跟'y'。
       (?<=d{4})d+(?=d{4})将匹配 '1234567890123456' 中除去头部四个数字和尾部四个数字外的其他数字,即56789012
      

  • 相关阅读:
    解决PLSQL Developer中文横着显示的问题
    品优购_day06
    品优购_day05
    品优购_day04
    品优购_day03
    品优购_day02
    java 学习中遇到的问题(二)泛型中<? extends T>和<? super T>的区别
    java 学习中遇到的问题(一)方法调用中的值传递和引用传递
    java中的字符串比较
    自学java 第十一章持有对象
  • 原文地址:https://www.cnblogs.com/xkzy/p/3824306.html
Copyright © 2011-2022 走看看