`
zccst
  • 浏览: 3322922 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[正则表达式] - replace

 
阅读更多
作者:zccst


2014-5-13
正则表达式是常学常新的知识点,一点点积累吧,今天重点看replace,以前印象中应该:

str.replace(old,new);

即从原字符串中找到old,然后用new来替换。



今天发现,第二个参数还可以是一个函数,而且该函数还有两个参数。

例如,jQuery中$.camelCase的实现细节。
var ret = $.camelCase(str);

// Convert dashed to camelCase; used by the css and data modules
// Microsoft forgot to hump their vendor prefix (#9572)
camelCase: function( string ) {
    return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
}

解析过程:

// Matches dashed string for camelizing
var    rmsPrefix = /^-ms-/,
    rdashAlpha = /-([\da-z])/gi,
    // Used by jQuery.camelCase as callback to replace()
    fcamelCase = function( all, letter ) {
        console.log(arguments);
        return letter.toUpperCase();
    },
string = "margin-top";
var a = string.replace( rdashAlpha, fcamelCase );
console.log(a);


注意到fcaemlCase是一个函数,而且有两个参数,实际中只使用第二个参数。
这两个参数分别是什么意思呢?
通过 rdashAlpha = /-([\da-z])/gi  可以知道,要从原字符串中寻找-x,并使用fcamelCase函数替换。
所以fcamelCase()函数的两个参数分辨是配平字符串,匹配结果。
打印arguments:
["-t", "t", 6, "margin-top"]



2:第二个参数为函数:
在ECMAScript3推荐使用函数方式,实现于JavaScript1.2.当replace方法执行的时候每次都会调用该函数,返回值作为替换的新值。

函数参数的规定:
第一个参数为每次匹配的全文本($&)。
中间参数为子表达式匹配字符串,个数不限.( $i (i:1-99))
倒数第二个参数为匹配文本字符串的匹配下标位置。
最后一个参数表示字符串本身。
这就是本文所要说replace威力强大的地方,理论的东西都是干货,我们需要示例解决一切空洞的问题:


例1:字符串首字母大写:
String.prototype.capitalize = function(){
    return this.replace( /(^|\s)([a-z])/g , function(m,p1,p2){
        console.log(arguments);
        return p1+p2.toUpperCase()
    ;} );
};

正则 /(^|\s)([a-z])/g 的意思是:开头或空白字符,并且后面紧邻一个a-z之间的字符。

打印arguments:
["i", "", "i", 0, "i am a boy !"]
[" a", " ", "a", 1, "i am a boy !"]
[" a", " ", "a", 4, "i am a boy !"]
[" b", " ", "b", 6, "i am a boy !"]

输出:I Am A Boy !


例2:对字符串“张三56分, 李四74分, 王五92分, 赵六84分”的分数提取汇总,算出平均分并输出每个人的平均分差距。
var s = "张三56分, 李四74分, 王五92分, 赵六84分";
var a = s.match(/\d+/g);
var sum = 0;
for(var i = 0 ; i < a.length; i++){
    sum += parseFloat(a[i]);
}

var avg = sum / a.length;
function f(){
    var n = parseFloat(arguments[1]);
    return n + "分" + "(" + ((n > avg) ? ("超出平均分" + (n - avg)) : ("低于平均分" + (avg - n))) + "分)";
}
var result = s.replace(/(\d+)分/g, f);
console.log(result);

输出:
张三56分(低于平均分20.5分), 李四74分(低于平均分2.5分), 王五92分(超出平均分15.5分), 赵六84分(超出平均分7.5分)

JavaScript的replace函数再加上正则的高级应用,JavaScript的replace将会发回更大的威力所在,在这里将不再深入正则高级应用断言之类的。






















(一)理论
js的replace函数规范如下
stringObject.replace(regexp/substr,replacement)

参数
regexp/substr 必需。规定子字符串或要替换的模式的 RegExp 对象。请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象。
replacement 必需。一个字符串值。规定了替换文本或生成替换文本的函数。

返回值    一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的。


说明

字符串 stringObject 的 replace() 方法执行的是查找并替换的操作。它将在 stringObject 中查找与 regexp 相匹配的子字符串,然后用 replacement 来替换这些子串。如果 regexp 具有全局标志 g,那么 replace() 方法将替换所有匹配的子串。否则,它只替换第一个匹配子串。

replacement 可以是字符串,也可以是函数。如果它是字符串,那么每个匹配都将由字符串替换。但是 replacement 中的 $ 字符具有特定的含义。如下表所示,它说明从模式匹配得到的字符串将用于替换。


(二)实例
例如,"hand hand hand"想变换为"hand.gif hand.gif hand.gif"

str = str.replace(/hand/,"hand.gif")
无效。。。
全部替换要加g,
str = str.replace(/hand/g,"hand.gif")
还是不行

参考了JavaScript的replace方法与正则表达式结合应用讲解这篇文章后,终于明白,原来要用()括起来,才会替换()里的东东。正确的写法如下:
str = "hand hand hand";
str=str.replace(/(hand)/g,"hand.gif"); 
document.write(str); 
正确输出:hand.gif hand.gif hand.gif。

JS的正则另一种写法是使用RegExp:
如str=str.replace(/(hand)/g,"hand.gif");
等同于:
reg = new RegExp("(hand)","g");
   str = str.replace(reg,'hand.gif');
reg需要动态生成时更适合使用这种方式。

扩展一下:
str = "hand'( hand'( hand'(";
str=str.replace(/(hand\'\()/g,"hand.gif"); 
document.write(str);

str = 'hand\'( hand\'( hand\'(';
str=str.replace(/(hand\'\()/g,"hand.gif"); 
document.write(str);
分享到:
评论

相关推荐

    C++正则表达式-regex类(不依赖其他库)

    C++正则表达式是C++11标准引入的一个强大工具,它允许程序员使用正则表达式进行文本模式匹配和搜索。在这个特定的案例中,我们关注的是`regex`类,它是C++ `&lt;regex&gt;`库的一部分,用于实现正则表达式操作。这个压缩包...

    PB实现的正则表达式

    在IT领域,正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,它能够进行复杂的模式匹配、查找、替换等操作。在本话题中,我们将探讨如何使用PowerBuilder 11.5这一经典的开发环境来实现正则...

    vb正则表达式实例(正则表达式测试程序)

    在VB.NET中,正则表达式(Regular Expression)是一种强大的文本处理工具,它允许程序员通过模式匹配来处理字符串。这个“vb正则表达式实例”很可能是为了帮助开发者测试和理解正则表达式的工作原理而设计的一个应用...

    EXCEL-VBA-正则表达式-从实例开始.docx

    - **Replace**:替换在正则表达式查找中找到的文本。例如,可以用一个新字符串替换所有匹配的文本。 - **Test**:对指定的字符串执行一个正则表达式搜索,并返回一个布尔值指示是否找到匹配的模式。如果找到了匹配的...

    正则表达式测试工具C#版(src)

    - `Regex.Replace(input, pattern, replacement)`:将输入字符串中符合正则表达式的部分替换为指定的字符串。 - `Regex.Split(input, pattern)`:根据正则表达式模式将输入字符串分割成多个子字符串。 4. **本...

    pb 使用正则表达式源码pbregexp

    标题中的“pb 使用正则表达式源码pbregexp”指的是在PowerBuilder(简称pb)环境中,利用名为“pbregexp”的正则表达式组件来实现源代码级别的正则表达式操作。PowerBuilder是一款流行的可视化的、面向对象的软件...

    VC、VC++,MFC 正则表达式类库

    正则表达式类库则为VC++和MFC的开发者提供了对正则表达式功能的支持。 "VC、VC++,MFC 正则表达式类库"指的是在MFC中实现或集成的正则表达式处理模块。这个库通常包含一系列的类和函数,允许程序员编写符合特定模式...

    正则表达式入门与提高---整理版_VBa_正则式_

    正则表达式是一种强大的文本处理工具,用于在字符串中匹配、查找、替换或者提取特定模式。在VBA(Visual Basic for Applications)环境中,正则表达式可以极大地增强你在Excel、Word等Office应用中的数据处理能力。...

    常用正则表达式大全.txt

    根据提供的文件信息,我们可以整理出一系列与正则表达式相关的知识点。这些知识点涵盖了从基本的数字验证到复杂的字符串匹配等多个方面。下面是详细的知识点总结: ### 基本概念 正则表达式是一种用于文本模式匹配...

    精通正则表达式-Jeffery E.F.Fridel著

    - **替换(Replace)**:将字符串中符合正则表达式的部分替换为新的文本。 - **分割(Split)**:根据正则表达式将字符串分割成多个部分。 3. **量词(Quantifiers)**: - `*`:表示前面的字符或字符组可以出现...

    Delphi2010正则表达式插件

    例如,`Execute` 方法用于执行正则表达式匹配,`Replace` 方法则可以实现字符串的替换功能。同时,插件还提供了诸如捕获组、回溯控制、Unicode支持等高级特性,使得处理复杂文本模式变得易如反掌。 总之,“Delphi ...

    Oracle数据库正则表达式

    同时,正则表达式也可以与其他 Oracle 函数结合使用,例如 substr()、replace()、instr() 等,来实现更加复杂的数据处理任务。 正则表达式是 Oracle 数据库中的一种强大的工具,可以帮助用户快速、高效地处理数据。

    c++写的正则表达式验证工具

    在IT行业中,正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、查找、替换等操作。C++作为一种通用编程语言,虽然标准库中没有内置正则表达式支持,但通过第三方库如Boost,我们可以很方便地在...

    强大的正则表达式生成工具 C#版

    - **Regex**:这是正则表达式的主要类,包含许多静态方法如`Match`、`Matches`、`Replace`、`Split`等,用于执行匹配、替换和拆分操作。 - **Match**:表示单个匹配结果,包含匹配的文本、子组等信息。 - **Group*...

    C#正则表达式大全, 判断字符串是否为正整数,中文,英文.....

    这样,我们可以使用正则表达式来描述要替换的字符串模式,然后使用 Replace 方法来实现字符串的替换。 知识点 2:判断字符串是否为正整数 在上面的代码中,我们可以看到一个名为 IsInt 的方法,该方法可以判断输入...

    正则表达式调试工具

    正则表达式(Regular Expression,简称regex)是用于在文本中匹配特定模式的强大工具,广泛应用于数据验证、搜索替换和文本处理等领域。正则表达式调试工具是开发人员用来测试和优化这些模式的重要辅助工具。本文将...

    jJAVA正则表达式替换字符

    本资源文件是我自己总结的,其中包括5个类,这5个类的代码基本概括了java正则表达式替换String的多种情况,比如获取某个文件路径中盘符/后边的部分内容,提取"&lt;title&gt;XXXX&lt;/title&gt;"中的文字XXXX,用正则表达式获取指定...

    qt正则表达式测试工具

    这个"qt正则表达式测试工具"显然是一个帮助开发者验证和调试正则表达式的实用程序。 正则表达式是一种特殊的文本字符串,用于描述复杂或重复的文本模式。它们在搜索、替换、数据提取等任务中非常有用。在Qt中,...

    JS常用正则表达式及其使用方法

    JavaScript中的正则表达式是进行字符串处理的重要工具,它们用于匹配、查找、替换或验证文本。在JS中,正则表达式可以静态定义,也可以动态创建。以下是一些常用的正则表达式及其使用方法。 1. **非负整数(正整数+...

    Oracle正则表达式详解(用法+实例)

    这些函数的使用方式类似于传统的 SQL 函数 `LIKE`、`INSTR`、`SUBSTR` 和 `REPLACE`,但采用了 POSIX 正则表达式而不是旧式的通配符 `%` 和 `_`。 ##### 1. `REGEXP_LIKE` - **功能**: 类似于 `LIKE` 函数,用于...

Global site tag (gtag.js) - Google Analytics