【拓展】
我们也可以自定义修剪方法,以实现更灵活的操作字符串,下面为JavaScript的String类型扩展多个字符串修剪方法。
截取字符串左侧字符
在VBScript中,left()方法的语法如下:
result = left(string,length)
它包含两个参数,第一个是操作的字符串,第二个是截取的长度。该方法返回截取的子字符串。
【示例1】实现相同的功能,同时考虑到JavaScript语法习惯,可以这样设计:
var left = String.prototype.left = function(){// 定义静态方法left(),以及String类型的方法left() var l = arguments.length; // 获取函数参数长度 if( l == 0 ){ // 如果没有参数 throw new Error( "缺少参数。" ); // 则抛出异常 } else if( l == 1 ){ // 如果仅有一个参数,则视为String类型的方法 var n = arguments[0] // 该参数值,表示截取字符的长度 if( n > 0 ){ // 如果截取字符大于0 return this.substring( 0, n ); // 则返回从字符串左侧开始截取的子字符串 }else if( n < 1 ){ // 如果小于1,则说明截取字符不够 return ""; // 则返回空字符串 }else { // 否则 throw new Error( "参数类型错误。" ); // 抛出异常,提示参数类型不是数值型数据 } }else{ // 如果参数长度大于1,则说明是静态方法 if( ( typeof arguments[0] == "string" ) && ( arguments[1] > 0 ) ){ // 如果第一个参数类型为字符串,第二个参数值大于0, 则通过调用参数字符串来进行截取 return arguments[0].substring( 0, arguments[1] ); // 返回截取的子字符串 }else{ throw new Error( "参数类型错误。" ); // 否则抛出异常,提示参数类型错误 } } }
在上面代码中,把left()方法定义为静态方法和对象方法两种形式。所谓静态方法,就是把函数直接传递给一个全局变量,这样就可以直接调用。所谓对象方法,就是把函数传递给String类型的原型属性上,这样只能够在字符串对象中进行调用。
考虑到用户在输入参数时,可能存在误输入,函数中设计了多种检测条件,如参数个数和参数类型。并根据参数个数和参数类型执行不同的操作。
作为静态方法直接调用:
var s = "javascript"; var s1 = left( s , 4 ); // 静态方法调用 alert( s1 ); // 返回字符串"java"
作为对象方法来进行调用:
var s = "javascript"; var s1 = s.left( 4 ); // 对象方法调用 alert( s1 ); // 返回字符串"java"
截取字符串右侧字符
在VBScript中,right()方法表示从字符串的尾部提取指定数目的字符,实际上它与left()方法是对应的。其实现的方法与上面的示例基本相同,只需要修改substring()截取子字符串的初始下标位置即可。具体说,就是把:
return this.substring( 0, n );
修改为:
return this.substring( this.length - n );
把:
return arguments[0].substring( 0, arguments[1] );
修改为:
return arguments[0].substring( arguments[0].length - arguments[1] );
其他代码不变。
清除字符串首尾的空格
trim()方法能够复制字符串并去掉首尾的空格。该方法能够匹配所有不可见字符,包括任何空白字符,如空格、制表符、换页符等。其语法格式如下:result = trim(string)
【示例2】这个方法实现起来比较简单,可以使用正则表达式来进行快速匹配:
var trim = String.prototype.trim = function(){// 定义trim()方法的静态方法和对象方法 return ( arguments[0] ? arguments[0] : this ).toString().replace( /(^\s*)|(\s*$)/gm, "" ); }
在该函数的返回表达式中,首先判断是否存在参数,如果存在参数,则使用第一个参数值,否则就使用this(指向当前对象)。然后,调用toString()方法把对象转换为字符串。最后,使用replace()进行匹配查找字符串首尾是否存在空格,并进行替换。匹配的正则表达式/(^\s*)|(\s*$)/gm说明如下。
- “\s”表示空格,“^”表示字符串的开始处。
- “$”表示字符串的结尾处。
- “|”表示或的意思,即可以是字符串头部出现空格,或者尾部出现空格,或者同时出现等。
- 修饰字m表示多行匹配的意思。
- 而g表示连续匹配的意思。
var s = " javascript "; alert(s.length); // 返回字符串长度为14 var s1 = s.trim(); // 清除两侧空格 alert( s1 ); // 返回字符串"javascript" alert(s1.length); // 返回字符串长度为10
测试发现应用trim()方法前后,字符串的长度是不同的,说明操作成功。
清除字符串左侧空格
lTrim()方法能够清除字符串左侧的空格。其实现方法与trim()方法基本相同,可以稍稍改动其中正则表达式的匹配模式。
【示例3】下面函数定义了如何清除字符串左侧空格。
var lTrim = String.prototype.lTrim = function(){ return ( arguments[0] ? arguments[0] : this ).toString().replace( /^\s*/gm, "" ); }
其中正则表达式/^\s*/gm仅能够匹配字符串的左侧空格。
清除字符串右侧空格
rTrim()方法与lTrim()方法操作正好相反,它能够清除字符串右侧的空格。
【示例4】下面函数定义了如何清除字符串右侧空格。
var rTrim = String.prototype.rTrim = function(){ return ( arguments[0] ? arguments[0] : this ).toString().replace( /\s*$/gm, "" ); }
其中正则表达式/\s*$/gm仅能够匹配字符串的右侧空格。
【示例5】如果要清除字符串中所有空格,包括字符串内部的,则可以使用如下方法来实现。
var allTrim = String.prototype.allTrim() = function(){ return ( arguments[0] ? arguments[0] : this ).toString().replace( /\s*/gm, "" ); }