本文详细介绍javascript中的字符串处理,包括String对象的使用,以及正则表达式RegExp的相关细节。

字符串是JavaScript的一种基本的数据类型。JavaScript 的字符串是不可变的(immutable),String 类定义的方法都不能改变字符串的内容。像String.toUpperCase()这样的方法,返回的是全新的字符串,而不是修改原始字符串。

String对象

创建 String 对象的语法:

new String(s);
String(s);

参数:
参数 s 是要存储在 String 对象中或转换成原始字符串的值。

返回值:

String 对象属性

String 对象方法

正则表达式 RegExp 对象

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

语法

直接量语法:
/pattern/attributes

创建 RegExp 对象的语法:
new RegExp(pattern, attributes);

返回值:

异常:

修饰符

修饰符 描述
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。

方括号

方括号用于查找某个范围内的字符:

表达式 描述
[abc] 查找方括号之间的任何字符。
[^abc] 查找任何不在方括号之间的字符。
[0-9] 查找任何从 0 至 9 的数字。
[a-z] 查找任何从小写 a 到小写 z 的字符。
[A-Z] 查找任何从大写 A 到大写 Z 的字符。
[A-z] 查找任何从大写 A 到小写 z 的字符。
[adgk] 查找给定集合内的任何字符。
[^adgk] 查找给定集合外的任何字符。
`(red blue

元字符

元字符(Metacharacter)是拥有特殊含义的字符:

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

量词

量词 描述
n+ 匹配任何包含至少一个 n 的字符串。
n* 匹配任何包含零个或多个 n 的字符串。
n? 匹配任何包含零个或一个 n 的字符串。
n{X} 匹配包含 X 个 n 的序列的字符串。
n{X,Y} 匹配包含 X 或 Y 个 n 的序列的字符串。
n{X,} 匹配包含至少 X 个 n 的序列的字符串。
n$ 匹配任何结尾为 n 的字符串。
^n 匹配任何开头为 n 的字符串。
?=n 匹配任何其后紧接指定字符串 n 的字符串。
?!n 匹配任何其后没有紧接指定字符串 n 的字符串。

小括号’()‘的作用:

RegExp 对象属性

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

RegExp 对象方法

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

正则表达式配合String方法的使用

var s = '000123abc0N/A abcfds123sjw055 sjwjkgd';
var reg = /\d{3}([a-zA-Z]+).(\d{2}|N\/A)\s\1/;
s.search( reg ) // 3

match

匹配模式:“3个数字,1个单词,1个任意的字符,2个数字或者字符串N/A,1个空格,然后重复第一个单词”

var s = '123abc0N/A abc';
s.match(/\d{3}([a-z]+).(\d{2}|N\/A)\s\1/);

// 输出总匹配串和两个分组
// ["123abc0N/A abc", "abc", "N/A"]

exec

match和exec是正则表达式匹配字符串的常用方法。两者实现的功能差不多,有些细微的区别:

  1. 使用方式
    • match是字符串包装对象的方法,用法:String.match(RegExp);
    • exec是正则表达式对象的方法,用法:RegExp.exec(String);
  2. 返回的结果
    • 当RegExp**没有设置全局标志 “g” **时,两者的返回结果相同。即无匹配值时返回null,有匹配值时返回一个数组(令array)。array[0]为匹配的字符串,array[1]、array[2]……则对应为正则表达式中圆括号匹配的子字符串$1、$2……。同时数组带有两个属性,array.index表示匹配字符串的初始位置,array.input表示正在检索的字符串。
    • 当RegExp**有设置全局标志 “g” 时,match在有值时返回一个数组array。数组的每项依次表示匹配到的所有的字符串,因此不再有圆括号匹配的子字符串了。此时数组没有index属性和input属性;exec则与没有全局标示 “g” 的表现无异。此时返回的是数组array,array[0]为当前匹配的字符串,array[1],array[2]……则为当前匹配下的圆括号匹配的字串。此时要注意RegExp对象的lastIndex属性**,表示原字符串中匹配的字符串末尾的后一个位置,当没有进一步的匹配结果时,lastIndex属性置0。因此,可用lastIndex的循环找出所有的匹配字符串。
var str = 'I love1 my job22';
var reg = /\b[a-z]+(\d+)\b/g;

var idx = 0, pos = 0;
var sub_str = str;
var ary = reg.exec( sub_str.substring(idx) );
while( ary != null ) {
	idx = reg.lastIndex;
	pos += idx;
	reg.lastIndex = 0;
	console.log( 'value: ' + ary[0] + ' lastPos: ' + pos );
	
	sub_str = sub_str.substring(idx);
	ary = reg.exec( sub_str );
}
// 输出:
// value: love1 lastPos: 7 VM299:11
// value: job22 lastPos: 9

replace

var reg = /(\w+)=(\w+)/;
var str = 'hello live=exist world!';
str.replace(reg,'$2=$1'); // "hello exist=live world!"

split

"|a|b|c".split("|") // ["", "a", "b", "c"]

var s = '1.hello2.world'
s.split( /\d+\./ ) // ["", "hello", "world"]