字符串操作规范
JS定义字符串方法
字符串直接量:使用双引号或者单引号包含任意长度的文本,
任何被引号包含的文本都是字符串数据。
注意:单双引号不能交错,含有多重语义的字符要加反斜杠\转义表示。
构造:使用string()类型函数构造字符串,该函数可以接受一个参数,并把它作为值来初始化字符串。
使用字符编码:使用fromChaCode()方法可以把Unicode字符编码转换为字符串。
字符串的值和长度
用valueOf()方法可以返回字符串的值。
为string扩展原型方法byteLength(),该方法枚举每个字符,,并根据字符变编码判断其是单音节还是双音节,然后统计字符串的长度。
字符串连接
使用oncat()方法,可以把多个参数加到字符串尾部,并且参数类型和个数不限。concat方法不会修改原字符串的值。
也可以借助数组的join()方法来连接字符串(特定环境)。
字符串查找
charAt()和charCodeAt()方法可以根据参数(非负整数下标)返回指定位置的字符或字符编码。
注意:若参数不在0~length-1之间,charAt方法返回空字符串;
charCodeAt返回NaN。
indexOf(从左往右)和lastIndexOf(从右往左)方法可以根据参数字符串返回指定子字符串下标位置。
search方法功能同indexOf,但只有一个参数,不能反向检索,也不支持全局模式。
match方法可以找出所有匹配的字符串,以数组形式返回。如果不是全局匹配,它只能执行一次匹配。若未找到,则返回null而不是空数组。
例:使用match()方法匹配URL字符串中所有点号字符。
var s="http://www.mysite.cn/index.html";
var a=s.match(/(\.).*(\.).*(\.)/);//执行一次匹配搜索
console.log(a.length);//返回4,包含4个元素的数组
console.log(a[0]);//返回字符串".mysite.cn/index."
console.log(a[1]);
console.log(a[2]);
console.log(a[3]);
字符串截取
substr()方法可以根据指定长度截取字符串。它包含两个参数,第一个代表起始下标,第二个代表截止长度。slice()方法同。
替换
replace()方法可以替换,包含两个参数,第一个表示执行匹配的正则表达式,第二个是准备替换平匹配的子字符串。它实际上执行的是同时查找和替换两个操作。
示例:从服务器端读取学生成绩,使用for语句把所有字符串转换为字符串,再来练习自动提取字符串中的分数,并汇总、算出平均分,最后用replace()方法提取每个分值并比较。
var score={//从服务器端接受的JSON数据
"张三":56;
"李四":76;
"王五":87;
"赵六":98;
},_score="";
for(var id in score){//将JSON转为字符串
_score+=id+score[id];
}
var a =_score.match(/\d+/g),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)?
("低于平均分"+(avg-n)))+"分)<br>;
}
var s1=_score.replace(/(\d+)/g,f);//设计替换的内容
document.write(s1);
字符串大小转换
toLowerCase
toUpperCase
字符串比较
localeCompare()方法包含一个参数,指定要比较的目标字符串。若当前字符串小于参数字符串,则返回小于0的数;大于则返回大于0的数;相等返回0。
字符串与数组转换
split()方法根据指定分隔符把字符串劈开为数组。
若参数为空字符串,split方法可以按单个字符分切,然后返回与字符串等长的数组。
若参数为正则表达式,则可以以匹配文本作为分隔符进行切分。
正则表达式
(规则表达式),是操作字符串的一种逻辑公式,用事先规定好的一些特定字符及其组合组成一个规则字符串,用来表达对字符串的一种匹配模式。
JS通过内置RegExp类型支持正则表达式。
定义正则表达式的方法有两种:构造,直接量。
使用RegExp构造函数可以定义正则表达式对象:
newRegExp(pattern,attributes)
pattern指定匹配模式或者正则表达式对象;attributes是一个可选修饰性标识,包括:
"g":全局匹配,在指定字符串范围内执行所有匹配
"i":定义不区分大小写的匹配
"m":多行匹配
正则表达式直接量使用双斜杠进行定义,双斜杠之间包含的字符为正则表达式的模式,字符模式不能用引号,标志字符放在最后一个斜杠后面。
//syntax:
/pattern/attributes
执行匹配
exec()方法
//syntax:
regexp.exec(string)
执行检测
test()方法,可以检测一个字符串是否包含另一个字符串。
编译正则表达式
使用compile()方法可以重新编译正则表达式。这样在脚本执行过程中可以动态修改正则表达式的匹配模式。
//syntax:
regexp.compile(regexp,modifier)
正则表达式的对象属性
属性 | 说明 | 读写属性 |
global | 返回boolean值,检测RegExp对象是否具有标志g | 只读 |
ignoreCase | 返回boolean值,检测RegExp对象是否具有标志i | 只读 |
multiline | 返回boolean值,检测RegExp对象是否具有标志m | 只读 |
lastIndex | 整数,返回或设置执行下一次匹配的下标位置 | 可读可写 |
source | 返回正则表达式的字符模式源码 | 只读 |
RegExp静态属性
长名 | 短名 | 说明 |
input | $_ | 返回当前所作用的字符串,初始值为空字符串”" |
index | 当前模式匹配的开始位置,从0开始计数。初始值为-1,每次成功匹配时,index 属性值都会随之改变 | |
lastIndex | 当前模式匹配的最后一个字符的下一个字符位置,从0开始计数,常被作为继续匹配的 起始位置。初始值为-1,表示从起始位置开始拽索,每次成功匹配时,lastIndex属性 值都会随之改变 | |
lastMatch | $& | 最后模式匹配的字符串,初始值为空字符串""。在每次成功匹配时,lastMatch属性 值都会随之改变 |
lastParen | $+ | 最后子模式匹配的字符串,如果匹配模式中包含有子模式(包含小括号的子表达式, 在最后模式匹配中最后一个子模式所匹配到的子字符串。初始值为空字符串""。每次成 功匹配时,lastParen属性值都会随之改变 |
leftContext | $` | 在当前所作用的字符串中,最后模式匹配的字符串左边的所有内容。初始值为空字 符串""。每次成功匹配时,其属性值都会随之改变 |
rightContext | $" | 在当前所作用的字符串中,最后模式匹配的字符串右边的所有内容。初始值为空字 符串""。每次成功匹配时,其属性值都会随之改变 |
$1~$9 | $1~$9 | 只读属性,如果匹配模式中有小括号包含的子模式,S1~S9属性值分别是第1~第9个 子模式所匹配到的内容。如果有超过9个以上的子模式,S1~S9属性值分别对应最后的 9个子模式匹配结果。在一个匹配模式中,可以指定任意多个小括号包含的子模式,但 RegExp 静态属性只能存储最后9个子模式匹配的结果。在RegExp实例对象的一些方 法所返回的结果数组中,可以获得所有圆括号内的子匹配结果 |
实例:表单验证
<form method="post" action="" name="myform" class="form" >
<label for="user_name">真实姓名<br/>
<input id-"user name" type="text" name="user_name" required pattern="^
([\u4e00-\u9fa5]+|([a-z]+\s?)+)$" />
</label>
<label for="user_item">比赛项目<br/>
<input list="ball" id="user_item" type-"text" name-"user_item" required/>
</label>
<datalist id="ball"><option value="篮球"/><option value="羽毛球"/><option value="桌球"/></datalist>
<label for="user_email">电子邮箱<br/>
<input id="user_email" type-"email" name-"user_email" pattern="^[0-9a-z]
[a-z0-9\._-](1,}@[a-z0-9-](1,}[a-z0-9]\.[a-z\.](1,}[a-z]S" required />
</label>
<label for="user_phone">手机号码<br/>
<input id-"user_phone" type="tel" name-"user _phone" pattern="^1\d(10)$/.(0\d(2,3)-?/\(0\d(2,3)\))?(1-9]\d(4,7)(-\d(1,8))?$" required/>
</label>
<label for="user_id">身份证号
<input id-"user id" type-"text" name-"user _id" required pattern-"^(1-9]|d(5)[1-9]\d(3)((0\d) |(1[0-2]))(([01112]\d)13[0-1])\d{3}([0-9]1x)$" />
</label>
<label for="user_born">出生年月
<input id-"user_born" type-"month" name-"user _born" required /></label>
<label for="user_rank">名次期望<span>第<em</label>
id="ranknum">5</em>名</span>
<input id-"user_rank" type="range" name-"user_rank" value="5" min="1" max="10"step="1" required /><br/>
<button type="submit" name="submit" value="提交表单">提交表单</button></form>
第2步,设计表单控件的验证模式。“真实姓名”选项为普通文本框,要求必须输入required,验
证模式为中文字符。
pattern="^([\u4e00-\u9fa5]+|([a-z]+\s?)+)$"
“比赛项目”选项设计一个数据列表,使用datalist 元素设计,使用 list="ball"绑定到文本框上。
第3步,“电子邮箱”选项设计 type=“email"类型,同时使用如下匹配模式兼容老版本浏览器。
pattern="²[0-9a-z]la-z0-9\._-1(1,}@[a-z0-9-1(1,)(a-20-9]\.(a-z\.1(1,)la-z19"
第4步,“手机号码”选项设计 type-"tel"类型,同时使用如下匹配模式兼容老版本浏览器。
pattern=“^1Nd(10)512(0\d(2,3)=71N(0\d(2,31\))2[1-9]Nd(4,7)(-\d(1,8))26"
第5步,“身份证号”选项使用普通文本框设计,要求必须输入。定义匹配模式如下。
pattern="^[1-9]\d(5)[1-9]\d(3)((0\d) |(1[0-2]))(([0|112]\d)13[0-1])\d(3)([0-9]|X)S"
第6步,“出生年月”选项设计type="month"类型,这样就不需要进行验证,用户必须在日期选择器面板中进行选择,无法作弊。
第7步,“名次期望”选项设计 type-"range"类型,限制用户只能在1~10进行选择。