上一节总结了创建正则表达式的语法,这一篇笔者总结了用于模式匹配的String四个方法:search()、replace()、match()、split()以及用于模式匹配的RegExp两个方法exec()、test()

String类

(1)str.search(regexp)

定义:search()方法将在字符串str中检索与表达式regexp相匹配的字串,并且返回第一个匹配字串的第一个字符的位置。如果没有找到任何匹配的字串,则返回-1。

example:

“JavaScript”.search(/script/i);      //output为4

  但是,search()方法不支持全局检索,因为会忽略正则表达式参数的标识g,并且也忽略了regexp的lastIndex属性,总是从字符串的开始位置进行检索,所以它会总是返回str的第一个匹配的位置。

(2)str.replace(searchValue, replaceValue)

定义:replace方法对string进行查找和替换操作,并返回一个新的字符串。

参数:

  • searchValue  可以是一个字符串或者是一个正则表达式对象。
    如果是一个字符串,那么searchValue只会在第一次出现的地方被替换,eg:

    var result = "mother_in_law".replace( '_' , '+' );    //output为mother+in_law

    如果是一个正则表达式并且带有g标识,它会替换所有的匹配,如果没有自带g标识,它会替换第一个匹配

    var str = "javascript";
    str.replace(/javascript/,'JavaScript'); //将字符串javascript替换为JavaScript
    str.replace(/a/g, 'b'); //将所有的字母a替换为字母b,返回 jbvbscript
  • replaceValue     可以是一个字符串也可以是一个函数。
    如果是一个字符串,则注意字符$拥有特别的含义

    var oldareacode = /\((\d{3})\)/g;
    var p = '(0663)1234567'.replace(oldareacode,'$1-'); //output为0663-1234567

    如果是一个函数,那么每次遇到一个匹配函数就会被调用一次,而该函数返回的字符串会被用作替换文本。传递给这个函数的第一个参数是整个被匹配的文本,第二个参数是分组1捕获的文本,第三个参数是分组2捕获的文本,以此类推:

     String.prototype.entityify = function(){
    var character = {
    '<' : '&lt;',
    '>' : '&gt;',
    '&' : '&amp;',
    '"' : '&quot;'
    }; return function(){
    return this.replace(/[<>&"]/g,function(c){
    console.log(c);
    return character[c];
    });
    };
    }();
    alert("<>>&".entityify()); //alert为&lt;&gt;&gt;&amp;

(3)str.match(regexp)

定义:让字符串和一个正则表达式进行匹配,并且是依据g标识来决定如何匹配。

  • 如果regexp没带g标识,那么调用string.match(regexp)的结果与调用regexp.exec(string)的结果一样
  • 如果regexp带有g标识,那他将生成所有的匹配(除了捕获分组之外)的数组
    example:
     String.prototype.entityify = function(){
    var character = {
    '<' : '&lt;',
    '>' : '&gt;',
    '&' : '&amp;',
    '"' : '&quot;'
    }; return function(){
    return this.replace(/[<>*&"]/g,function(c){
    return character[c];
    });
    };
    }(); /**
    * string.match(regexp)
    */
    var text = '<html><body bgcolor=linen><p>' + 'This is <b>bold</b>!</p></body></html>';
    var tags = /[^<>]+|<(\/?)([A-Za-z]+)([^<>]*)>/g;
    var a,i;
    a = text.match(tags);
    for(i = 0;i < a.length;i += 1){
    document.writeln(('// [' + i + '] ' + a[i]).entityify());
    document.writeln('<br>');
    }
    document.writeln('<br>');

    输出结果为: 

(4)str.split(separator,limit)

定义:将string分割成片段来创建一个字符串数组。
参数:

  • limit     可选参数,用来限制被分割片段的数量。
    eg:var digits = '0123456789';var a = digits.split('',5);   输出结果为:['0','1','2','3','4'0];
  • separator  可以为一个字符串或者一个正则表达式
    如果是字符串,则会返回一个分割后的数组
    example:
    var a = '192.168.1.113'.split('.');alert(a);    //输出为数组['192','168','1','113']
    var b = ' |a|b|c|*'.split('|');alert(b); //输出为数组['','a','b','c','*'],注意第一个元素是一个空格!!!

    如果是正则表达式,则例子如下:

    var text = 'i, am ,   gdt';
    var d = text.split(/\s*,\s*/);
    alert(d); //输出数组['i','am','gdt']

RegExp对象

(1)regexp.exec(string)

定义:成功匹配regexp和字符串string,则返回一个数组,数组中下标为0的元素将包含正则表达式regexp匹配的子字符串,下标为1的元素是分组1捕获的文本,下标为2的元素是分组2捕获的文本,依次列推,如果匹配失败,则返回null

  如果regexp带有一个g标识,查找不是从这个字符串的起始位置开始,而是从regexp.lastIndex(初始值为0)开始,如果匹配成功,那么regexp.lastIndex将被设置为改匹配后的第一个字符的位置,不成功的匹配会重置regexp.lastIndex为0。

还是用例子来体现吧,example:

 String.prototype.entityify = function(){
var character = {
'<' : '&lt;',
'>' : '&gt;',
'&' : '&amp;',
'"' : '&quot;'
}; return function(){
return this.replace(/[<>*&"]/g,function(c){
return character[c];
});
};
}(); /**
* regexp.exec(string)
*/
var text = '<html><body bgcolor=linen><p>' + 'This is <b>bold</b>!</p></body></html>';
var tags = /[^<>]+|<(\/?)([A-Za-z]+)([^<>]*)>/g;
var a,i;
while((a = tags.exec(text))){
for(i = 0;i < a.length;i += 1){
document.writeln(('// [' + i + '] ' + a[i]).entityify());
document.writeln('<br>');
}
document.writeln('<br>'); }

输出结果为:

  这个例子和string.match(regexp)中的例子很相似,不过可以直观看出regexp.exec(string)返回的是一个二维数组,而string.match(regexp)则是返回一个一维数组,还有两个的用法使用对象不同,注意不要写错

(2)regexp.test(string)

定义:如果该regexp成功匹配string,返回true,否则返回false(test方法是使用正则最简单和最快的方法,而exec是使用正则最强大同时也是最慢的方法)

example:

  var b = /&.+;/.test('gdt &amp; fxt');            //output为true

  

  好了,关于模式匹配的方法已经罗列出来,接下来要将一些关于正则的实例,都是较为经典并且实用的~

用于模式匹配的String方法和RegExp方法的更多相关文章

  1. Junit 注解 类加载器 .动态代理 jdbc 连接池 DButils 事务 Arraylist Linklist hashset 异常 哈希表的数据结构,存储过程 Map Object String Stringbufere File类 文件过滤器_原理分析 flush方法和close方法 序列号冲突问题

    Junit 注解 3).其它注意事项: 1).@Test运行的方法,不能有形参: 2).@Test运行的方法,不能有返回值: 3).@Test运行的方法,不能是静态方法: 4).在一个类中,可以同时定 ...

  2. JavaScript学习笔记-用于模式匹配的String方法

    用于模式匹配的String方法:   String支持4种使用正则表达式的方法:           seach()用于检索,参数是一个正则表达式,返回第一个与之匹配的子串的位置,找不到则返回-1,如 ...

  3. java数组、java.lang.String、java.util.Arrays、java.lang.Object的toString()方法和equals()方法详解

    public class Test { public static void main(String[] args) { int[] a = {1, 2, 4, 6}; int[] b = a; in ...

  4. Object、String、数组的 toString() 方法和 equals() 方法及java.util.Arrays

    public class Test { public static void main(String[] args) { int[] a = {1, 2, 4, 6}; int[] b = a; in ...

  5. 详解equals()方法和hashCode()方法

    前言 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码.equals()和hashCode()都不是final方 ...

  6. JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别

    JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别   关于获取类的字段有两种方式:getFields()和getDeclaredFields().我们先来 ...

  7. java中equals方法和hashcode方法的区别和联系,以及为什么要重写这两个方法,不重写会怎样

    一.在Object类中的定义为:public native int hashCode();是一个本地方法,返回的对象的地址值.但是,同样的思路,在String等封装类中对此方法进行了重写.方法调用得到 ...

  8. Java基础系列-equals方法和hashCode方法

    原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述         equals方法和hashCode方法都是有Object类定义的. publi ...

  9. Java 如何重写对象的 equals 方法和 hashCode 方法

    前言:Java 对象如果要比较是否相等,则需要重写 equals 方法,同时重写 hashCode 方法,而且 hashCode 方法里面使用质数 31.接下来看看各种为什么. 一.需求: 对比两个对 ...

随机推荐

  1. loj#6437. 「PKUSC2018」PKUSC(计算几何)

    题面 传送门 题解 计算几何的东西我好像都已经忘光了-- 首先我们可以把原问题转化为另一个等价的问题:对于每一个敌人,我们以原点为圆心,画一个经过该点的圆,把这个圆在多边形内部的圆弧的度数加入答案.求 ...

  2. 老男孩Day13作业:ORM学员管理系统

    一.作业需求: 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下 讲师视图: 管理班级,可创建班级,根据学员qq号把学员加入班级      可创建指定班级的上课纪录,注意一节上 ...

  3. 2.2、Softmax Regression算法实践

    Softmax Regression算法实践 有了上篇博客的理论知识,我们可以利用实现好的函数,来构建Softmax Regression分类器,在训练分类器的过程中,我们使用多分类数据作为训练数据: ...

  4. Maven搭建Spring+SpringMVC+Mybatis+Shiro项目详解

    一. 环境搭建: 1. 开发工具:myeclipse 2014 / IDEA: 2. maven管理版本:apache-maven-3.0+: 3. jdk 1.7.0+4. Tomcat8.0 二: ...

  5. 【算法笔记】B1047 编程团体赛

    1047 编程团体赛 (20 分) 编程团体赛的规则为:每个参赛队由若干队员组成:所有队员独立比赛:参赛队的成绩为所有队员的成绩和:成绩最高的队获胜. 现给定所有队员的比赛成绩,请你编写程序找出冠军队 ...

  6. Json与jsonpath再认识与初识

    一.json格式的数据 1.认识 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.适用于 ...

  7. [jQuery] 在线引用地址

    百度静态资源公共库: http://libs.baidu.com/jquery/1.9.1/jquery.js jQuery网站: http://code.jquery.com/jquery-1.9. ...

  8. PIE SDK打开HDF、NC数据

    1. 功能简介 HDF 是美国国家高级计算应用中心(National Center for Supercomputing Application)为了满足各种领域研究需求而研制的一种能高效存储和分发科 ...

  9. Tomcat疑难杂症解决记录

    1. startup.bat闪退 cmd中运行startup.bat报错: The JRE_HOME environment variable is not defined correctly Thi ...

  10. shell 命令之bind,enable,ulimit

    1.bind 在shell中,内建(builtin)命令bind,格式如下: bind [-m keymap] [-lpsvPSVX] bind [-m keymap] [-q function] [ ...