时间
与Object,Number等一样,时间也有官方提供的构造函数Date
var dt = new Date()
console.log(dt)
通过构造函数获取的时间是调用函数时的时间点,时间点的所有信息封装到对象中了,我们可以通过一些方法获取时间点的信息
console.log(dt.getFullYear())//获取完整的年份
console.log(dt.getYear())//获取年份,如2023年返回123,1为特殊值,23为年份
console.log(dt.getMonth())//获取月份 范围:0-11
console.log(dt.getDate())//获取日期
console.log(dt.getHours())//获取小时 范围:0-23
console.log(dt.getMinutes())//获取分钟 范围:0-59
console.log(dt.getSeconds())//获取秒 范围:0-59
console.log(dt.getMilliseconds())//获取毫秒 范围:0-999
console.log(dt.getTime())//1970-01-01 08:00:00-000 到现在过去了多少毫秒
//UTC为 1970-01-01 00:00:00-000(与时区有关)
console.log(dt.getDay())//获取星期 范围:1234560
console.log(dt.getUTCHours())//获取UTC现在的小时,其余方法同理
设置时间信息
在用Date构造函数创建时间对象时,我们是能够传入参数的,通过参数,我们能够定义传入的时间点
// var dt = new Date(参数)
传入的参数可以是一个,也可以是多个
只传入一个参数时
//填时间格式字符串
var dt = new Date("2023-07-15")
console.log(dt)// 2023-07-15 08:00:00-000
// var dt = new Date("2023-07-15 17:23:15")
// console.log(dt)
// var dt = new Date("Sat Jul 15 2025 17:23:15 GMT+0800 (中国标准时间)")
// console.log(dt.getFullYear())
// var dt = new Date("Mon Aug 07 09:23:08 +0800 2023")
// console.log(dt)
//填数字(毫秒)
// var dt = new Date(25000)//距离世界校准时间25000毫秒
// console.log(dt)
多个参数时
//填数字
var dt = new Date(1999, 2, 3)//1999-02-03 00:00:00-000
console.log(dt)
// var dt = new Date(1999, 2, 3, 14, 23, 58)//1999-02-03 14:23:48-000
// console.log(dt)
// var dt = new Date(1999, 2, 40, 27, 23, 58)
// console.log(dt)
时间转化字符串
时间也有转字符串的方法
//时间转化字符串
var dt = new Date()
console.log(dt.toString())
// console.log(dt.toLocaleString())
// console.log(dt.toLocaleDateString())
// console.log(dt.toLocaleTimeString())
// console.log(`${dt.getFullYear()}-${dt.getMonth()}-${dt.getDate()}`)
时间的运算
时间是能够进行计算的
//时间的运算
var dt1 = new Date()
var dt2 = new Date("2023-08-16 17:45:00")
var re = dt1 - dt2 //得到两个时间的差值(毫秒)
console.log(re)
修改时间信息
时间也有自己的静态方法
console.log(Date.now())
其等同于
console.log(new Date().getTime())
当然,我们更关心的应该是如何修改时间信息
//修改一个时间点对象的信息
var dt = new Date()
dt.setMinutes(23)
console.log(dt)
上图中的方法能修改分钟,修改月份,日期等都是使用set方法
正则表达式
正则表达式又称规则表达式,专门来操作字符串
字符串的格式
//'{"name":"karen","age":123}' JSON
//'email=123&pwd=123&page=1' querystring
//'<h1>6666</h1>' HTML模版字符串(template)
上图展示了部分
创建方法
两种创建方式:
1、直接量
其本身是一个对象,表达的意义是一种规则
//在两个斜杠中间写规则
var reg=/abc/;
var str="abcd";
reg.test(str) ; //检查在字符串str中有没有符合reg规则得字符
2、构造方法RegExp()
使用new操作符,可以将已经存在的正则表达式用来给函数RegExp()传参,构造新的正则表达式
var reg=new RegExp("abc");
var str="abcd";
reg.test(str);
属性
正则表达式的属性(也称修饰符),可以在全局搜索中不区分大小写:
i ---》(ignoreCase )执行匹配时忽略大小写
g---》(global)执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)
m---》(multiline)执行多行匹配
var reg=/abce/i
var str="ABCEd"
reg.test(str)
var reg=new RegExp("abc","im")
var str="abcd"
字符串的match方法
var reg=/ab/;
var str="ababababab";
str.match(reg);//["ab"],只查找到第一个匹配值便返回
reg=/ab/g;
str.match(reg);//全局查找,把所有匹配值均返回
方括号
使用方括号用于查找某个范围内的字符 ,一个中括号代表一位,中括号里边的内容代表的是这一位可以取值的范围
var reg=/[ab][cd][d]/g;
var str="abcd";
str.match(reg);
var reg=/[0-9A-Za-z][cd][d]/g;
var str="ab1cd";
str.match(reg);
插入符^放到[]里边表示"非"的意思
var reg=/[^a][^b]/g;
var str="ab1cd";
str.match(reg)
在括号里可以加入"|"表示"或"的意思,"|"操作符两边放匹配规则
var reg=/(abc|bcd)/g
匹配规则可以任意组合
元字符
元字符是拥有特殊含义的字符,元字符也可以组合放进中括号里去使用,一个元字符代表一位
元字符 | 描述 |
---|---|
\w --word | 查找单词字符(字母+数字+下划线) |
\W | 查找非单词字符==[^\w] |
\d --data | 查找数字 |
\D | 查找非数字字符 |
\s --space | 查找空白字符 |
\S | 查找非空白字符 |
\b --border | 匹配单词边界 "today is friday" |
\B | 匹配非单词边界 |
\t | 查找制表符 |
\n | 查找换行符 |
\f | 查找换页符 |
\v | 查找垂直制表符 |
\uXXXX | 查找以十六进制规定的Unicode字符 |
. --必记 | (点号)查找单个字符,除了换行和行结束符 |
var reg=/\wcd2/g;
var str="bcd2";
str.match(reg)
若要在正则表达式里匹配反斜杠\,直接写/\/是不行的,需要加上转义字符/\\/
元字符表内的内容不一一进行代码展示了
量词
量词,代表数量的词(下面表达式的n代表的是一个匹配规则,n后边符号的符号定义量词规则)
量词 | 描述 |
---|---|
n+ | 匹配任何包含至少一个n的字符串 |
n* | 匹配任何包含零个或多个n的字符串 |
n? | 匹配任何包含零个或一个n的字符串 |
n{X} | 匹配包含X 个n 的序列的字符串/\w{10}/ |
n{X,Y} | 匹配任何包含X 个至Y 个n 的序列的字符串/\w{6,16}/ |
n{X,} | 匹配包含至少X 个n 的序列的字符串 |
n$ | 匹配任何结尾为n 的字符串 |
^n | 匹配任何开头为n 的字符串 |
S(?=n) | 匹配任何其后紧接指定字符串n 的字符串S abc(?!d) |
S(?!n) | 匹配任何其后没有紧接指定字符串n 的字符串S |
n+ ----> {1,Infinity}个
n* ----> {0,Infinity}个
n? ---->(0,1)个
^n ----> 匹配以n 为开头的字符串nn$ ----> 匹配以n 为结尾的字符串n
?=n ----->n只参与条件限定,限定其后紧接指定字符串n 的字符串,但并不参与选择
?!n ----->n只参与条件限定,限定其后没有紧接指定字符串n 的字符串,但并不参与选择
var str="aabaaaa";
var reg=/aa(?=b)/g;//b只参与条件限定,并不参与选择
str.match(reg);//["aa"],此时只有一个a 它的后面有紧跟字符b
var str="aabaaaa";
var reg=/aa(?!b)/g;
str.match(reg);//[aa,aa],此时有4个a 它的后面没有紧跟字符b
方法
方法 | 描述 |
---|---|
search | 检索与正则表达式相匹配的值,返回匹配字符串的位置 |
match | 找到一个或多个正则表达式的匹配 |
replace | 替换与正则表达式匹配的字串 |
split | 把字符串分割为字符串数组 |
str.match(reg) ---->在规则中是否含有global 属性时的表现是不同的(与reg.exec(str)的微小区别
str.search(reg) ---->匹配后返回的是所匹配字符串的位置,匹配不到时返回-1
str.split(reg) ---->按照正则表达式拆分字符串
str.replace(reg,str1) ---->字符串替换;最实用的方法 。
reg=/(\w)\1(\w)\2/;//无global属性,反向索引
str="aabbgghh";
str.match(reg);//["aabb","a","b",index:0,input:"aabb"]
reg=/(\w)\1(\w)\2/g;//具有global属性
str="aabbgghh";
console.log(str.match(reg));//["aabb","gghh"]
reg=/(\w)\1(\w)\2/g;
str="edbaabbbbee";
str.search(reg);
str.search(reg);//3,与lastIndex无关,只返回第一个符合匹配规则的索引位置
reg=/(\w)\1(\w)\2/g;
str="abc";
str.search(reg);//-1
var str="dai1akhd2gkhs";
var reg=/\d/g;
console.log(str.split(reg));//["dai","akhd","gkhs"],即将分隔符两侧的字符串进行拆分
var str="aa";
console.log(str.replace("a","b")) //ba,只会替换匹配到的第一个
var str="abcdedfa";
var reg=/a/;
str.replace(reg,"b"); //ba,跟上边一样没写"g"还是只替换一个
var str="abcdedfa";
var reg=/a/g;
str.replace(reg,"b");
贪婪匹配与非贪婪匹配
贪婪匹配即照着"量词"规则中要求的更多个的情况去做匹配
var str="aaaaa";
var reg=/a+/g;
str.match(reg);//["aaaaa"]
非贪婪匹配,在"量词"规则后边多加一个问号"?"
var str="aaaaa";
var reg=/a+?/g;
str.match(reg);//["a","a","a","a","a"]
var str="aaaaa";
var reg=/a??/g;//第一个问号代表0~1个,第二个问号代表能取0就不取1去做匹配
str.match(reg);//["","","","","",""]
//实用:匹配用双大括号括起来的字符
var l=/\{\{(.+)\}\}/g;
var r=/\{\{(.+?)\}\}/g;
var str=`{{name}}--{{msg}}`
str.match(l);//["{{name}}--{{msg}}"]
str.match(r);//["{{name}}", "{{msg}}"]