Day7:字符串的使用、正则表达式
定义:就是ECMAScript标准中已经定义好的,由浏览器厂商已经实现的标准对象
内置对象列表:
String
Boolean
Number
Array
Date
Math
Error
Function
Object
Global
定义:专门封装原始类型的数据,并提供对数据常用操作的内置类型 为什么要用:让原始类型的数据也可以像引用类型一样,拥有方法和属性 包装类型有: String类型 Number类型 Boolean类型 何时使用包装类型:只要用原始类型的数据调用方法或访问属性时,js引擎都会自动创建对应的包装类型对象,方法调用完,包装类型对象自动释放 eg1: var num=5.678;//原始类型 //num=new Number(num);//包装类型 console.log(num.toFixed(2)); //num=null;//释放包装类型对象
测试正则表达式工具:RegexBuddy 4
一、String
1、创建字符串:
(1)var str="";//原始类型
(2)var strObj=new String(" ")//包装类型对象
(3)var str=String(" ");//原始类型,把其他的类型做一个转换
注:
是否为对象就看有没有new
直接量:直接可以看到的值
2、转义字符:
(1)代替字符串中的非打印字符:\n \t
(2)如果字符串内容中包含和语法冲突的特殊字符,可用\转为普通字符
eg:console.log("\tjs是互联网\"第一大语言\"");
3、字符串内容一旦创建不可改变
(1)如果修改,都要创建新的字符串,保存新结果,替换旧字符串
var str="Hello"; //var StrObj=new String(str); str=str.toUpperCase(); //strObj=null; console.log(str);
(2)**规律:所有字符串API,都需要变量接收返回值**
二、字符串的使用
注:字符串类型底层其实都是用字符数组实现的
1、str.length:字符串的字符个数属性
2、大小写转换:大小写字母一视同仁时,先转换,再处理,比如:重名验证、重复邮箱
(1)toLowerCase():转小写
(2)toUpperCase():转大写
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var code="5AsD";
var input="";
while((input=prompt("请输入验证码:"+code).toLowerCase())!=code.toLowerCase()){
alert("验证码错误");
}
document.write("登录成功");
</script>
</body>
</html>
3、var char=str.charAt(index):获取指定位置字符
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var pid="110102198006282151";
//提取倒数第二位的字符
var char=pid.charAt(pid.length-2);
console.log(char%2==0?"女":"男");
</script>
</body>
</html>
4、var num=str.charCodeAt(index):获取指定位置字符的unicode编号
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var input=prompt("输入消息:");
var result=[];
for(var i=0;i<input.length;i++){
result.push(input.charCodeAt(i));
}
//优化:
//频繁对字符串+=,要用数组代替
//每个字符放入数组
//join("")拼接数组元素
document.write(result.join(""));
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
//将转换后不足5位的补全成5位
var input=prompt("输入消息:");
var result=[];
for(var i=0;i<input.length;i++){
var num=input.charCodeAt(i);
if(num<10000){//只要不足5位都要补齐
var arr=[0,0,0,0,0];
var code=num+"";//将num转为string,这种从性能上来说效率高
var start=5-code.length;
for(var n=0;n<code.length;n++,start++){
arr[start]=code[n];
}
num=arr.join("");
}
result.push(num);
}
document.write(input+"<br/>");
document.write(result.join(""));
</script>
</body>
</html>
上题优化:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
//将转换后不足5位的补全成5位
var input=prompt("输入消息:");
var result=[];
for(var i=0;i<input.length;i++){
var num=input.charCodeAt(i);
if(num<10000){//只要不足5位都要补齐
num=num+10000+"";
num="0"+num.slice(1);
}
result.push(num);
}
document.write(input+"<br/>");
document.write(result.join(""));
</script>
</body>
</html>
5、检索字符串
(1)查找关键字:var index=str.indexOf("关键字",from);//返回关键字所在位置,如果没找到,返回-1,只找第一个关键字位置,默认只能从位置0开始,from为从from开始向后查找
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
//查找所有关键字的位置
var str="女神说要来,我草草的收拾了房间,结果她又说不来了,我说我草";
/**
var index=str.indexOf("我草");
document.write(index+"<br/>");
index=str.indexOf("我草",index+1);
document.write(index);**/
var index=-1;
while((index=str.indexOf("我草",index+1))!=-1){
document.write(index+"<br/>");
}
</script>
</body>
</html>
var index.str.lastIndexOf("关键字",from);:从最后一个字符,向前找,只要关键字离结尾近,就用这个,from为从from开始向前查找,返回值同上,因为字符在数组中的下标是固定的
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
//查找所有关键字的位置
var str="女神说要来,我草草的收拾了房间,结果她又说不来了,我说我草";
/**
var index=str.indexOf("我草");
document.write(index+"<br/>");
index=str.indexOf("我草",index+1);
document.write(index);**/
var index=str.length;
while((index=str.lastIndexOf("我草",index-1))!=-1){
document.write(index+"<br/>");
}
</script>
</body>
</html>
(2)替换关键字:
(3)获取子字符串:var subStr=str.slice(start,end+1);
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var pid="110102198006282151";
var birth=pid.slice(6,6+8);
//相当于:var birth=pid.slice(-4-8,-4);
console.log(birth);
</script>
</body>
</html>
var subStr=str.substring(start,end+1);和slice一样,唯一区别就是他不支持负数作为参数
var subStr=str.substr(start,count);
以上3个方法省略第二个参数默认都是取到结尾
6、将编码后的的字符进行解码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script>
var input=prompt("粘贴编码");
var arr=[];
//每次取5个字符,翻译为一个字符
for(var i=0;i<input.length;i+=5){
var code=input.substring(i,i+5);
arr.push(String.fromCharCode(code));
}
var str=arr.join("");
document.write(str);
</script>
</head>
<body>
</body>
</html>
7、分隔字符串
按规律分隔字符串:var subs=str.split("分隔符"[,count]) 返回切割后的数组
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script>
//将每个单词首字符转换为大写
var str="no zuo no die";
var words=str.split(" ");
for(var i=0;i<words.length;i++){
words[i]=words[i][0].toUpperCase()+words[i].substring(1);
}
str=words.join(" ");
document.write(str);
</script>
</head>
<body>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script>
//计算一个字符串中,中文、英文、数字、其他字符的个数
//判断字符的种类,使用unicode的范围:
//48-57:数字字符0-9
//65-90:大写字母A-Z
//97-122:小写字母a-z
//19968-40869:汉字
//注:unicode包括ASCII
var engCount=0;
var numCount=0;
var chsCount=0;
var other=0;
var str="选购AppleCare+,延保2年";
for(var i=0;i<str.length;i++){
var num=str.charCodeAt(i);
if(num>=19968&&num<=40869){
chsCount++;
}else if((num>=65&&num<=90)||(num>=97&&num<=122)){
engCount++;
}else if(num>=48&&num<=57){
numCount++;
}else{
other++;
}
}
document.write('中文'+chsCount+'英文'+engCount+'数字'+numCount+'其他'+other);
</script>
</head>
<body>
</body>
</html>
8、模式匹配:可以设置查找或者替换的规则
何时使用模式匹配:要查找的关键字可能发生有规律的变化
如何使用模式匹配:
(1)定义模式:/关键字/模式
(2)按模式替换关键字:var str=str.replace(reg,"新值");
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script>
var str="No zuo no die";
//定义模式,即使是字符串两个斜线之间也不能加双引号
var reg=/no/ig;//忽略大小写 g全局进行查找,所有都替换 i忽略大小写,专门给英文用,因为中文不区分大小写呀!
str=str.replace(reg,"**");//默认仅替换第一个关键字,要想全局替换,要在模式用定义g
document.write(str);
</script>
</head>
<body>
</body>
</html>
9、获得所有关键字的内容:var kwords=str.match(reg);//返回数组,只能获得关键字的内容,无法确定每个关键字的位置
kwords.length:找到的关键字的个数,如果没有找到就返回null
注:只要有可能返回null就要先判断不等于null,再处理,否则,你的程序就会报错了,注意注意了,null.length你觉得它对吗??????
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script>
var str="No zuo no die";
//定义模式,即使是字符串两个斜线之间也不能加双引号
var reg=/no/ig;//忽略大小写 g全局进行查找,所有都替换
var kwords=str.match(reg);
if(kwords!=null){
document.write(kwords+"共替换了:"+kwords.length);
}
</script>
</head>
<body>
</body>
</html>
10、和indexOf完全相同的查找:var index=str.search(reg)(了解就好)
indexOf不支持模式查找,search其实是indxOf的模式查找版
三、正则表达式(重点)
定义:一个字符串中字符出现的规律
何时使用正则表达式?:验证字符串格式,查找关键字,替换关键字
比如:银行卡查询密码一般都是6位数字、用户名必须是字母数字下划线的组合
1、选择符号:[所有备选字符]必须多选一使用,一个[]只能代表1位字符的规则
[^xx]表示除了xx都行,必须放在中括号的第一个
2、横线符号(-):表示字符的范围,备选字符连续的范围!
比如:[1-9][a-z][A-Z][a-zA-Z]//可以局部使用
汉字的范围:[\u4e00-\u9fa5]
3、预定义字符集:使用简化的字符来定义常用字符集
比如:[0-9]---------->\d
[a-zA-Z0-9_]------------>\w
空字符---------->\s:代表一切看不到的字符,它只能代表一个,一个制表符也算一个空字符
.:任意一个字符
注:如果规则正文中出现特殊符号,用\转为原文
4、数量词:规定前边一个字符出现次数的两次
语法:{min,max}
{num}:固定长度
{min,}:至少min个,多了不限
手机号:\+86\s1[3578]\d{9}
浙公网安备 33010602011771号