14.正则表达式
(1)初始化
a.字面量
var pattern = /abc/igm
b.构造函数
var pattern= new RegExp(“abc”,“igm”);
(2)修饰符
i ignore case 忽略大小写
g global 全局
m multiline 多行
(3)使用
RegEsp.peototype.test()
测试目标字符串是否匹配模式
RegExp.prototype.exec();
在字符串中获取匹配的内容
“my website is http://192.168.15.131:8888/index”
请你检索出url,并且分别拿到协议,ip,端口,路径
问题:如何根据正则表达式查询出所有的符合模式的内容
var str = “my phone is 18812344321, my emil is licy@briup.com, my name is charles, my friend is jacky, his phone is 17751229900, my friend is tom, his phone is 15912344432.”
function search(str){var pattern = /((188)|(177)|(159))\\d{8}/g;var result;while(result = pattern.exec(str)){console.log(result[0]);}}爬虫1. 获取网页文件2. 从网页中读取所有的字符串3. 在字符串中过滤从京东首页中成功爬取所有的图片地址4) 正则表达式 (入门)独立学科,用于匹配字符串。常用于检索,论文查重,爬虫,表单验证。1. 直接量/abc//123/转义,d表示字符\"d\" \"\\d\"表示转义,表示数字/\\s/ 空白符/\\S/ 非空白符/\\d/ /[0-9]//\\D/ /[^0-9]//\\w/ /[a-zA-Z0-9]//\\W/ /[^a-zA-Z0-9]/2. 字符类/[0-9]/ 匹配0~9中的任意一个字符/[^0-9]/ 匹配非0~9中的任意一个字符3. 数量词{n} 匹配n次{n,m} 匹配n~m次{n,} 匹配n+次? 0或1次+ 1或多次* 0或多次4. 贪婪匹配与非贪婪匹配默认是贪婪匹配,对于数量来说,尽可能多。如果希望非贪婪匹配,在数量词后添加?\"hello world\"var pattern = /\\w{1,5}/5. 选择url协议://ip:port/pathhttp://127.0.0.1:80/index.htmljdbc:mysql://127.0.0.1:3306/cmsvar str = \"my website url is http://127.0.0.1:80/cms/index.html , my database url is jdbc:mysql://127.0.0.1:3306/cms , this is ok\"var pattern = /(http|jdbc\\:mysql|ftp)\\:\\/\\/(((\\d{1,3})\\.
){3}((\\d{1,3})))(?\\d{2,4}))?(/[\\w.])/ig
6. 分组
/(http|jdbc:mysql|ftp)?/(\\w{1,3}.){+}:?(\\d{2,4})?(/[\\w.])/ig
exec()result[0] 整个模式匹配的结果result[1] 第一个分组匹配的结果result[2] 第二个分组匹配的结果...7. 引用\\1 引用第一个分组匹配的结果\\2 引用第二个分组匹配的结果5) 常见应用检索出所有的手机号。6) 测试 (牛客网 - 正则表达式)
- 其他内置函数[ol]
包装器类型
基本数据类型默认是无法调用Object原型中的方法,为了丰富基本数据类型的功能,【通过基本数据类型的变量也可以调用方法】,js就实现了自动装箱功能【当调用基本数据类型变量的方法的时候,会自动转换为其构造函数的实例对象】
Number
var a = 3;
// a = new Number(a);
//自动装箱 a -> Number.prototype ->Object.prototype
a.toString();
console.log(a); // 自动拆箱
Boolean
String -
String api
var str = “hello world”正则表达式相关方法
参数都可以为正则表达式,如果为字符串,会先转化为正则表达式
String.prototype.split()
将字符串根据指定参数进行切割,返回一个数组
“hello”.split(\”\”) //[‘h’,‘e’,‘l’,‘l’,‘o’]
“terry|larry”.split(\”\”) //[‘h’,‘e’,‘l’,‘l’,‘o’]
电信采集
门闸,- 文本文件 -> 数据库
苏E00W5J|9:00|7
苏E00W5J|9:50|8
苏E00W5J|12:00|7
苏E00W5J|17:30|8
String.prototype.search()
与RegExp.prototype.test类似,返回的匹配模式的字符串的索引
String.prototype.match()
与RegExp.prototype.exec类似
如果非全局模式,返回结果与exec方法的执行结果类似,支持显示分组
如果是全局模式,返回结果为数组,数组元素为整体匹配的结果。
String.prototype.replace(regexp,string)
返回值为替换后的结果 - 检索方法
String.prototype.indexOf()
String.prototype.lastIndexOf() - 截取方法
String.prototype.slice(begin,end)
返回截取后的结果,原值不改变
String.prototype.substr(begin,len)
len表示截取的长度
返回截取后的结果,原值不改变
String.prototype.substring(begin,end)
与slice相同
String.prototype.trim()
消除字符串左右两边的空格 - 大小写转换
String.prototype.toUpperCase();
String.prototype.toLowerCase(); - 属性
length - 其他方法
…
Date 构造函数
var now = new Date(timestamp);
Date.prototype.getTime();
时间戳 ,当前时间到格林威治标准时间的毫秒数 1596510493471
可以使用时间戳转换成任意的数据格式
Date.prototype.getFullYear();
年
Date.prototype.getMonth();
月
Date.prototype.getDate();
日
Date.prototype.getDay();
周几
Date.prototype.getHours();
时
Date.prototype.getMinutes();
分
Date.prototype.getSeconds()
秒
业务:
时间戳 -> 日期格式 YYYY-MM-DD hh:mm:ss
Math
是对象,不是函数
Math.random()
Math.ceil()
向上舍入
Math.floor()
向下舍入
Math.round()
四舍五入
Math.max()
Math.min()
[/ol]
- 构造函数封装
如何创建一个对象?
字面量/Object – 纯对象,只能Object.prototype中的方法,并且类型无法细分。
细分类型
特定的对象可以调用特定方法
工厂函数模式
function PersonFactory(name,age,gender){
var p =new Object();
p.name = name;
p.age = age;
p.gender = gender;
return p;
}
var p = PersonFactory(“terry”,12,“gender”);
p.constructor // Object
问题:对象类型无法细分。
构造函数模式
function Person(name,age,gender){
this.name= name;
this.age = age;
this.gender = gender;
this.sayName = function(){
console.log(“my name is”,this.name);
}
//如果该函数使用new来调用,1) this指向当前实例对象2)函数执行完毕后,会将当前实例对象返回
}
// p1指向实例对象
var p1 = new Person(“terry”,12,“male”);
// p2为undefined
var p2 = Person(“terry”,12,“male”);
解决:1) 对象类型细分的问题
问题:函数存储
如果将函数存放到实例对象,每个实例对象拥有一个独自的函数,而这样是毫无意义。
构造函数(实例属性)+原型(实例方法,共享属性)
基本属性维护在实例中,共同的方法维护构造函数的原型中。
function Person(name,age,gender){
this.name= name;
this.age = age;
this.gender = gender;
}
Person.prototype.sayName = function(){
console.log(“my name is”,this.name);
}
Person.prototype.sayAge = function(){
console.log(“my age is”,this.age);
}
var p = new Person(“terry”,12,“male”);
问题:原型方法封装性较差
增强版
function Person(name,age,gender){
this.name= name;
this.age = age;
this.gender = gender;
}
Person.prototype = {
constructor:Person, // 核心点
sayName :function(){
console.log(“my name is”,this.name);
}
}
2) 对象检测
typeof obj;
obj.constructor ; // 查看obj的构造函数
obj instanceof 构造函数 // obj是否是指定构造函数的实例
p instanceof 动物
obj的原型链中是否包含指定构造函数的原型
3) 继承
实例对象可以调用其构造函数原型中的方法以及其构造函数父函数原型中的方法…
var arr = [1,2,3];
arr -> Array.prototype -> Object.prototype
Animal Dog
Dog继承Animal
dog -> Dog.prototype -> Animale.prototype
1) 借用构造函数
function Aniaml(name,age){
this.name = name;
this.age = age;
}
Animal.prototype = {
constructor :Animal,
sayName:function(){
console.log(\’my name is \’,this.name);
},
sayAge:function(){
console.log(\’my age is \’,this.age);
}
}
function Dog(name,age,gender){
//借用构造函数
Animal.call(this,name,age);
/*
this.name = name;
this.age = age;
*/
this.gender = gender;
}
2) 原型链继承
Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;
Dog.prototype.sayGender = function(){
}
代码:
function Animal(name,age){this.name=name;this.age=age;}Animal.prototype={constructor:Animal,sayNme:function(){console.log(\"my name is:\",this.name);},sayAge:function(){console.log(\"my age is:\",this.age);}}function Dog(name,age,gender){this.name=name;this.age=age;this.gender=gender;}Dog.prototype=new Animal();Dog.prototype.constructor=Dog;Dog.prototype.sayGender=function(){console.log(\"my gender is:\",this.gender);}var dog=new Dog(\"black\",5,\"man\");console.log(dog);console.log(\"--------------\");dog.sayName();dog.sayAge();dog.sayGender();