• 正则表达式


    1.什么是正则表达式
    2.JavaScript RegExp 对象
      RegExp 对象属性global,ignoreCase,ignoreCase,multiline,source
      RegExp 对象方法compile、test、exec
    3.支持正则表达式的 String 对象的方法

    4.元字符表

    什么是正则表达式

       正则表达式是被用来匹配字符串中的字符组合的模式。在JavaScript中,正则表达式也是对象。这种模式可以被用于RegExpexectest方法以及 Stringmatchreplacesearchsplit方法。

    JavaScript RegExp对象

       RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。

       创建正则表达式两种方式:

       正则表达式字面量

    /pattern/attributes
    var re = /ab+c/;

        调用RegExp对象的构造函数,如下所示:

    new RegExp(pattern, attributes);
    var re = new RegExp("ab+c");

      参数
      参数 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式。
      参数 attributes 是一个可选的字符串,包含属性 "g"、"i" 和 "m",分别用于指定全局匹配、区分大小写的匹配和多行匹配。ECMAScript 标准化之前,不支持 m 属性。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。

      RegExp对象属性:

    属性描述FFIE
    global RegExp 对象是否具有标志 g。 1 4
    ignoreCase RegExp 对象是否具有标志 i。 1 4
    lastIndex 一个整数,标示开始下一次匹配的字符位置。 1 4
    multiline RegExp 对象是否具有标志 m。 1 4
    source 正则表达式的源文本。 1 4

      RegExp对象方法:

    方法描述FFIE
    compile 编译正则表达式。 1 4
    exec 检索字符串中指定的值。返回找到的值,并确定其位置。 1 4
    test 检索字符串中指定的值。返回 true 或 false。 1 4

      compile方法定义和用法,用的不多,不做过多解释:

      compile() 方法用于在脚本执行过程中编译正则表达式。

      compile() 方法也可用于改变和重新编译正则表达式。

      exec方法定义和用法

      exec() 方法用于检索字符串中的正则表达式的匹配。返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。

    <script type="text/javascript">
    
    var str = "Visit W3School, W3School is a place to study web technology."; 
    var patt = new RegExp("W3School","g");
    var result;
    
    //返回匹配到的结果
    while ((result = patt.exec(str)) != null) { document.write(result); document.write("<br />"); document.write(patt.lastIndex); document.write("<br />"); } </script>

      结果:W3School
          14
         W3School
          24

      

      test定义和用法:

      test() 方法用于检测一个字符串是否匹配某个模式。匹配返回 true,否则返回 false。

    RegExpObject.test(string)

      例子:

    <script type="text/javascript">
    var str = "Visit W3School";
    var patt1 = new RegExp("W3School");
    
    var result = patt1.test(str);
    
    document.write("Result: " + result);
    </script>

      结果  :Result: true

     总结:

      1.exec方法是使用正则表达式的最强大和最慢的方法。如果它成功地匹配regexp和字符串String,它会返回一个数组。数组中下标为0的元素将包含正则表达式regexp匹配的字符串。下标为1的元素是分组1捕获的文本,下标为2的元素是分组2捕获的文本,以此类推。如果匹配失败,它会返回null。

      2.test方法是使用正则表达式的最简单和最快的方法。如果该regexp匹配string,它返回true;否则,它返回false。

    支持正则表达式的String对象的方法

    方法描述FFIE
    search 检索与正则表达式相匹配的值。 1 4
    match 找到一个或多个正则表达式的匹配。 1 4
    replace 替换与正则表达式匹配的子串。 1 4
    split 把字符串分割为字符串数组。 1 4

      1.string.search(regexp)

      search方法和indexOf方法类似,只是它接收一个正则表达式对象作为参数而不是一个字符串。如果找到匹配,它返回第1个匹配的首字符位置,如果没有找到匹配,则返回-1。此方法会忽略g标识,且没有position参数。它同时忽略 regexp 的 lastIndex 属性,并且总是从字符串的开始进行检索,这意味着它总是返回 stringObject 的第一个匹配的位置。

      注释:要执行忽略大小写的检索,请追加标志 i。

    例var text = 'and in it he says "Any damn fool could';
            var pos = text.search(/["']/)  //结果为18

      2.strng.match(regexp)和stringObject.match(searchvalue)

      match方法让字符串和一个正则表达式进行匹配。它依据g标识来决定如何进行匹配。如果没有g标识,那么调用string.match(regexp)的结果与调用regexp.exec(string)的结果相同。然而,如果带有g标识,那么它生成一个包含所有匹配(除捕获组之外)的数组。

    var str="Hello world ll world!"
    alert(str.match("world!"));     //结果world
    console.log(str.match(/world/g));  //结果[world,world]

      3.string.split(separator,limit)

      split方法把这个string分割成片段来创建一个字符串数组。可选参数limit可以限制被分割的片段数量。separator参数可以是一个字符串或者一个正则表达式。

    var digits = '0123456789';
            var a = digits.split('',5);  //a是['0,'1','2','3','4','5'];

      4.stringObject.replace(regexp/substr,replacement)

      replace方法对string进行查找和替换操作,并返回一个新的字符串。参数searchValue可以是一个字符串或者一个正则表达式对象。

      

    参数描述
    regexp/substr

    必需。规定子字符串或要替换的模式的 RegExp 对象。

    请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象。

    replacement 必需。一个字符串值。规定了替换文本或生成替换文本的函数。

      返回值
      一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的。
      说明
      字符串 stringObject 的 replace() 方法执行的是查找并替换的操作。它将在 stringObject 中查找与 regexp 相匹配的子字符串,然后用 replacement 来替换这些子串。如果 regexp 具有全局标志 g,那么 replace() 方法将替换所有匹配的子串。否则,它只替换第一个匹配子串。
      replacement 可以是字符串,也可以是函数。如果它是字符串,那么每个匹配都将由字符串替换。但是 replacement 中的 $ 字符具有特定的含义。如下表所示,它说明从模式匹配得到的字符串将用于替换。

    字符替换文本
    $1、$2、...、$99 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。
    $& 与 regexp 相匹配的子串。
    $` 位于匹配子串左侧的文本。
    $' 位于匹配子串右侧的文本。
    $$ 直接量符号。

      用使用这些组号,则有个问题就是正则表达式要存在组号,关于组则相应的分组匹配自表达式,一个误区:

      注意:

      (...)捕获型分组,又可以叫字表达式,捕获型分组会复制它所匹配的文本,并将其放到result数组里,每个捕获分组都会被指定一个编号。
      (?:)非捕获性分组,仅做简单的匹配,并不会捕获所匹配的文本,性能比捕获性分组效率高,非捕获性分组不会干扰捕获型分组的编号。

      能体现replace用法的例子:

      在本例中,我们将把 "Doe, John" 转换为 "John Doe" 的形式:

    name = "Doe, John";
    name.replace(/(w+)s*, s*(w+)/, "$2 $1");

      在本例中,我们将把所有的花引号替换为直引号:

    name = '"a", "b"';
    name.replace(/"([^"]*)"/g, "'$1'");

      在本例中,我们将把字符串中所有单词的首字母都转换为大写:

    name = 'aaa bbb ccc';
    uw=name.replace(/w+/g, function(word){
      return word.substring(0,1).toUpperCase()+word.substring(1);}
      );  

      replace两个经典例子区分其区别就能了解其用法:

      例一(采用全局匹配加g也是一样的结果):

    <script type="text/javascript">
    
    name = "Doe, John,12344";
    
    document.write(name.replace(/(w+)s*, s*(w+),d+/, function($1,$2){return $2}));
    //弹出结果为John
    </script>

      例二:

    <script type="text/javascript">
    
    name = "Doe, John";
    
    document.write(name.replace(/(w+)s*, s*(w+)/, "$2 $1"));
    //结果为 John,Doe
    </script>

      例三:

    <script type="text/javascript">
    
    name = "Doe, John,12344";
    
    document.write(name.replace(/(w+)s*, s*(w+),d+/, function($2){return $2}));
    //弹出结果为Doe, John,12344
    </script>

    结论,要想返回匹配的单个组元素,必须将匹配的组都作为参数。

    元字符表

      元字符是正则表达式的一部分,当我们要匹配正则表达式本身时,必须对这些元字符转义.下面是正则表达式用到的所有元字符

      注意:正则转义,如果对特殊字符转义拿捏不准时,可以给任何特殊字符都添加一个前缀来使其字面化,注意前缀不能使字母或数字字面化。常见的需要转义的字符 -( [ { ^ $ | ) ? * + .等

    元字符描述
    . 查找单个字符,除了换行和行结束符。
    w 查找单词字符。
    W 查找非单词字符。
    d 查找数字。
    D 查找非数字字符。
    s 查找空白字符。
    S 查找非空白字符。
     匹配单词边界。
    B 匹配非单词边界。
    查找 NUL 字符。
    查找换行符。
    f 查找换页符。
    查找回车符。
    查找制表符。
    v 查找垂直制表符。
    xxx 查找以八进制数 xxx 规定的字符。
    xdd 查找以十六进制数 dd 规定的字符。
    uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。

      最后补充一下正则懒惰/贪婪规则:

      *?重复任意次,但尽可能少重复。

      +?重复1次或更多次,但尽可能少重复。

      ??重复0次或1次,但尽可能少重复。

      {n,m}?重复n到m次,但尽可能少重复。

      {n,}?重复n次以上,但尽可能少重复。

    资料来源: 正则表达式30分钟入门教程 http://deerchao.net/tutorials/regex/regex.htm

           精通 JS正则表达式-Aaron http://www.cnblogs.com/aaronjs/archive/2012/06/30/2570970.html

               javascript正则表达式 http://www.cnblogs.com/rubylouvre/archive/2010/03/09/1681222.html

           js 常用正则表达式表单验证代码(javascript) http://www.qingdou.me/3716.html

           javascript常用正则表达式汇总 http://www.zhufengpeixun.cn/jishuziliao/javaScriptzhuanti/2011-11-15/157.html

         正则表达式在线工具 http://tool.lu/regex/

  • 相关阅读:
    一个小时前,美国主流媒体,头条,谷歌两位创始人突然宣布退下来,把万亿美元的帝国交给Sundar Pichai
    Fox新闻报道,帮助北朝鲜使用加密货币专家被捕
    看新闻,说墨西哥政府发起了一个军事行动,抓住了11月杀死9位美国人的三名嫌疑犯
    黑五千万不要去商场,就像打仗一样。
    Facebook 一个热搜帖,美国一个老人癌症不治最后的心愿是跟儿子喝啤酒。
    这周末又参加班里同学生日party,同学父母包场2小时花费大约1000美金左右。
    Google谷歌总部员工家庭活动
    800年没有写博客了,今天重新开始。
    iOS image processing with the accelerate framework(透明玻璃效果)
    Custom View Controller Transitions and Storyboard
  • 原文地址:https://www.cnblogs.com/pingfan1990/p/4319544.html
Copyright © 2020-2023  润新知