ArkTS日期方法、定时器与延时器及正则表达式
本文介绍了JavaScript中的Date对象和正则表达式相关知识。Date对象部分包含创建方式(当前时间、时间戳、日期字符串、年/月/日参数)、常用方法(获取/设置本地时间和UTC时间)以及时间戳处理示例。正则表达式部分涵盖创建方式、常用方法(test、exec)、各类元字符(普通、边界、限定、特殊等)及其应用示例,还介绍了正则的懒惰性、贪婪性特性以及预查技术。字符串方法部分讲解了replace
·
Date对象及其方法
1. 创建Date对象
常见的创建方式有以下几种:
// 1. 无参数:表示当前时间(本地时区)
const now = new Date();
// 2. 传入时间戳(毫秒级,number类型,从1970-01-01 00:00:00 UTC(国际标准时间)开始计算)
const date1 = new Date(1620000000000); // 对应2021-05-03左右
// 3. 传入日期字符串(支持ISO格式、自然语言格式等)
const date2 = new Date("2024-09-28"); // 2024年9月28日
const date3 = new Date("2024-09-28 12:30:45"); // 带时分秒
// 4. 传入年、月、日、时、分、秒、毫秒(注意:月份从0开始,0=1月,以此类推,11=12月)
const date4 = new Date(2024, 8, 28, 12, 30, 45); // 2024年9月28日12:30:45
2. 常用方法
Date对象的方法分为获取 / 设置本地时间和获取 / 设置 UTC 时间(国际标准时间)两类,常用方法如下:
| 方法 | 说明(本地时间) | 对应 UTC 方法(国际标准时间) |
|---|---|---|
getFullYear() |
获取年份(4 位,如 2024) | getUTCFullYear() |
getMonth() |
获取月份(0-11,0=1 月) | getUTCMonth() |
getDate() |
获取日期(1-31) | getUTCDate() |
getDay() |
获取星期 (0-6,0=周日) | getUTCDay() |
getHours() |
获取小时(0-23) | getUTCHours() |
getMinutes() |
获取分钟(0-59) | getUTCMinutes() |
getSeconds() |
获取秒数(0-59) | getUTCSeconds() |
getMilliseconds() |
获取毫秒(0-999) | getUTCMilliseconds() |
getTime() |
获取时间戳(毫秒级,从 1970-01-01 UTC 开始) | - |
setFullYear(year) |
设置年份(如 setFullYear (2025)) | setUTCFullYear(year) |
setMonth(month) |
设置月份(0-11) | setUTCMonth(month) |
Date.now() |
直接获取此时此刻的时间戳 | - |
3. 利用时间戳获取当前的年月日时分秒
// 1. 获取当前时间戳
const timestamp = Date.now();
// 2. 用时间戳创建Date对象
const date = new Date(timestamp);
// 3. 提取年月日时分秒
const year = date.getFullYear();
const month = date.getMonth() + 1; // 月份0-11,需+1
const day = date.getDate();
const hours = date.getHours();
const minutes = date.getMinutes();
const seconds = date.getSeconds();
// 4. 格式化输出(补零处理)
const formatted = `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')} ${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
console.log("当前时间(Date):" + formatted);
// 示例输出:2025-09-28 15:30:45
定时器与延时器
1. 延时器:setTimeout(延迟执行一次)
setTimeout用于在指定毫秒数后执行一次函数,返回一个定时器 ID(number类型),可用于后续取消任务。
let timerId: number = setTimeout(handler: Function, delay: number, ...args: any[]): number;
handler:延迟后执行的函数,写成箭头函数的样式。delay:延迟时间(毫秒,默认 0)。args:传递给 handler 的参数(可选)。
// 3秒后执行一次任务
const delayId = setTimeout((name: string) => {
console.log(`Hello, ${name}! 3秒已过`);
}, 3000, "ArkTS"); // 最后一个参数"ArkTS"会传给handler
// 取消延时任务(如果在3秒内执行)
// clearTimeout(delayId);
2. 定时器:setInterval(周期性执行)
setInterval用于每隔指定毫秒数重复执行函数,返回一个定时器 ID,可用于取消任务。
let timerId: number = setInterval(handler: Function, interval: number, ...args: any[]): number;
handler:每次间隔后执行的函数。interval:间隔时间(毫秒)。args:传递给 handler 的参数(可选)。
// 每隔1秒执行一次任务(打印当前时间)
let count = 0;
const intervalId = setInterval(() => {
count++;
console.log(`第${count}次执行:${new Date().toLocaleTimeString()}`);
// 执行5次后停止
if (count >= 5) {
clearInterval(intervalId);
console.log("定时器已停止");
}
}, 1000);
3. 取消任务:clearTimeout与clearInterval
clearTimeout(timerId):取消setTimeout创建的延时任务。clearInterval(timerId):取消setInterval创建的周期性任务。
注意:必须保存定时器 ID 才能取消任务,否则任务会一直执行(可能导致内存泄漏)。
正则表达式
基本概念
- 数据类型:Regular Expression(正则表达式),属于复杂数据类型
- 作用:按特定语法规则创建模式,用于验证字符串是否符合规则
正则表达式的创建方式
- 字面量方式javascript运行
let 变量名 = /正则符号/; - 内置构造函数方式javascript运行
let 变量名 = new RegExp('正则符号');
常用方法
- test () - 匹配方法
- 语法:
正则.test(要检测的字符串) - 返回值:布尔值(
true表示符合规则,false表示不符合)
- 语法:
- exec () - 捕获方法(暂未讲解)
符号组成
1. 普通元字符
| 符号 | 含义 | 说明 |
|---|---|---|
\d |
一位数字 | 匹配 0-9 任意数字 |
\D |
一位非数字 | 匹配非数字字符 |
\s |
一位空白内容 | 匹配空格、缩进等空白字符 |
\S |
一位非空白内容 | 匹配非空白字符 |
\w |
一位数字 / 字母 / 下划线 | 匹配 0-9、a-z、A-Z、_ |
\W |
一位非数字 / 字母 / 下划线 | 匹配非\w字符 |
. |
一位非换行任意内容 | 匹配除换行外任意字符 |
\ |
转义符 | 将有意义符号转为文本,或反之 |
2. 边界元字符
| 符号 | 含义 | 说明 |
|---|---|---|
^ |
开头 | 表示字符串开始位置 |
$ |
结尾 | 表示字符串结束位置 |
- 注意:
^和$一起使用时,表示完整匹配(从开头到结尾)
3. 限定元字符
| 符号 | 含义 | 说明 |
|---|---|---|
* |
0 到多次 | 匹配前面元素 0 次或多次 |
+ |
1 到多次 | 匹配前面元素 1 次或多次 |
? |
0 到 1 次 | 匹配前面元素 0 次或 1 次 |
{n} |
恰好 n 次 | 匹配前面元素恰好 n 次 |
{n,} |
n 到多次 | 匹配前面元素至少 n 次 |
{n,m} |
n 到 m 次 | 匹配前面元素 n 到 m 次 |
4. 特殊元字符
| 符号 | 含义 | 说明 | |
|---|---|---|---|
() |
分组 | 1. 单独捕获;2. 作为一个整体 | |
| ` | ` | 或 | 分界线为小括号或正则边界 |
[] |
包含 | 匹配括号内任意一个字符 | |
[^] |
非 | 匹配不在括号内的任意字符 | |
- |
至 | 与[]或[^]连用,表示范围 |
- 范围示例:
[0-9]等价于\d;[^0-9]等价于\D;[\u4e00-\u9fa5]表示所有中文字符
5. 重复元字符
| 符号 | 含义 | 说明 |
|---|---|---|
\数字 |
重复引用 | 重复第 n 个分组的内容(需完全一致) |
- 示例:
\1表示重复第一个分组的内容
标识符
| 符号 | 含义 | 说明 |
|---|---|---|
i |
忽略大小写 | 匹配时不区分大小写 |
g |
全局匹配 | 匹配所有符合条件的结果 |
应用示例
- HTML 标签匹配javascript运行
let reg = /^<(p|span)><\/\1>$/i; console.log(reg.test('<P></p>')); // true console.log(reg.test('<p></span>')); // false - 复杂模式匹配javascript运行
let reg = /^[1234](a|b|c|d)##(111|222|333)\2@@\1{2}$/; console.log(reg.test('1a##111111@@aa')); // true
注意事项
- 正则中的特殊字符需用
\转义 - 用
()分组时,可通过\数字引用分组内容 |操作符优先级较低,通常需与()配合使用- 字符范围
[a-z]基于 Unicode 编码,需连续才能使用
正则表达式的捕获
exec() 方法
- 语法:
正则.exec(字符串) - 作用:从原始字符串中捕获符合正则要求的字符串片段
- 返回值:
- 没有匹配项时返回
null - 有匹配项时返回一个数组,
[0]位置是捕获出的字符串片段
- 没有匹配项时返回
不同情况下的捕获行为
1. 没有 () 和 g
let reg = /\d{3}/;
let str = 'qwerty123uiopas456dfghjkzxcv789bnm000';
let res = reg.exec(str); // ["123"]
2. 有 () 分组
let reg = /(\d{2})(\d{2})(\d{2})/;
let str = '1234567890';
let res = reg.exec(str);
// ["123456", "12", "34", "56"]
3. 有 g 全局标识符
let reg = /\d{3}/g;
let str = 'qwerty123uiopas456dfghjkzxcv789bnm000';
let res1 = reg.exec(str); // ["123"]
let res2 = reg.exec(str); // ["456"]
let res3 = reg.exec(str); // ["789"]
let res4 = reg.exec(str); // ["000"]
let res5 = reg.exec(str); // null
匹配但不捕获 (?:)
- 当需要使用
()作为整体但不想单独捕获时使用
let reg = /(\d{2})(\d{2})(?:\d{4})(\d{2})(\d{2})/;
let str = '123456789012';
let res = reg.exec(str);
// ["123456789012", "12", "34", "90", "12"]
捕获所有匹配项的示例
let reg = /\d{3}/g;
let str = 'qwerty123uiopas456dfghjkzxcv789bnm000';
let arr: string[] = [];
let res = reg.exec(str);
while (res !== null) {
arr.push(res[0]);
res = reg.exec(str);
}
console.log(arr); // ["123", "456", "789", "000"]
正则表达式的两大特性
1. 懒惰性
- 表现:每次捕获都从字符串
[0]位置开始检索 - 解决方法:添加全局标识符
g
2. 贪婪性
- 表现:捕获时会尽可能多地获取内容
- 解决方法:使用非贪婪限定符(在原有限定符后加
?)
| 贪婪限定符 | 非贪婪限定符 | 作用描述 |
|---|---|---|
* |
*? |
匹配前面的元素0 到多次,非贪婪模式下会尽可能少匹配 |
+ |
+? |
匹配前面的元素1 到多次,非贪婪模式下会尽可能少匹配 |
? |
?? |
匹配前面的元素0 到 1 次,非贪婪模式下会尽可能少匹配 |
{n,} |
{n,}? |
匹配前面的元素至少 n 次(n 到多次),非贪婪模式下会尽可能少匹配 |
{n,m} |
{n,m}? |
匹配前面的元素n 到 m 次,非贪婪模式下会尽可能少匹配 |
let str = '<div class="box" id="box"><span>123</span></div>123';
// 贪婪匹配
let reg1 = /<div.*>/;
console.log(reg1.exec(str));
// 匹配整个div及其内容
// 非贪婪匹配
let reg2 = /<div.*?>/;
console.log(reg2.exec(str));
// 只匹配开始的div标签
正则预查(零宽断言)
正向预查
正向预查用于判断目标内容的后面是否符合指定模式,本身不匹配具体内容(零宽),包括两种类型:
| 类型 | 语法 | 说明 |
|---|---|---|
| 正向肯定预查 | (?=) |
匹配 “后面紧跟着指定模式” 的内容(即内容 + 后续指定模式同时存在) |
| 正向否定预查 | (?!) |
匹配 “后面不跟着指定模式” 的内容(即内容存在,且后续无指定模式) |
反向预查
反向预查用于判断目标内容的前面是否符合指定模式,同样不匹配具体内容(零宽),包括两种类型:
| 类型 | 语法 | 说明 |
|---|---|---|
| 反向肯定预查 | (?<=) |
匹配 “前面是指定模式” 的内容(即前面指定模式 + 内容同时存在) |
| 反向否定预查 | (?<!) |
匹配 “前面不是指定模式” 的内容(即内容存在,且前面无指定模式) |
let str = 'windows2012windows2000windowsXPwindowsVistawindows98windows';
// 正向肯定预查 - 后面带数字的windows
let reg1 = str.match(/windows(?=\d+)/g); // ["windows", "windows",”windows"]
// 正向否定预查 - 后面不带数字的windows
let reg2 = str.match(/windows(?!\d+)/g); // ["windows", "windows", "windows"]
// 反向肯定预查 - 前面带数字的windows
let reg3 = str.match(/(?<=\d+)windows/g); // ["windows", "windows", "windows"]
// 反向否定预查 - 前面不带数字的windows
let reg4 = str.match(/(?<!\d+)windows/g); // ["windows", "windows", "windows"]
字符串方法与正则表达式
1. replace() 方法
- 语法:
字符串.replace(字符串/正则, 替换字符串) - 特点:使用正则时默认只替换一次,添加
g标识符可全局替换
let str = '111qwert123yuiopaas456dfghjkzxc789vb000nm';
// 替换字符串
let r1 = str.replace('123', '***');
// 替换第一个匹配项
let r2 = str.replace(/\d{3}/, '***');
// 全局替换所有匹配项
let r3 = str.replace(/\d{3}/g, '***');
2. search() 方法
- 语法:
字符串.search(字符串/正则) - 返回值:匹配片段的开始索引,未找到返回
-1
let str = '111qwert123yuiopaas456dfghjkzxc789vb000nm';
let r1 = str.search('yu'); // 11
let r2 = str.search('y0u'); // -1
let r3 = str.search(/a{2}/); // 16
3. match() 方法
- 语法:
字符串.match(字符串/正则) - 返回值:
- 参数为字符串或无
g的正则:与exec()相同 - 参数为有
g的正则:返回所有匹配项的数组
- 参数为字符串或无
let str = '111qwert123yuiopaas456dfghjkzxc789vb000nm';
let r1 = str.match('123'); // ["123"]
let r2 = str.match(/\d{3}/); // ["123"]
let r3 = str.match(/\d{3}/g); // ["111", "123", "456", "789", "000"]
更多推荐


所有评论(0)