修剪字符串

课后整理 2020-12-20

【拓展】

我们也可以自定义修剪方法,以实现更灵活的操作字符串,下面为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说明如下。

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, "" );
}