目录
一、正则表达式的介绍
1.正则表达式的概念:
正则表达式是用于匹配字符串模式的工具,它是由字符和特殊字符组成的序列。正则表达式通常用于在文本中搜索、匹配或替换特定模式的文本。.
2.正则表达式的基本概念和元字符:
-
普通字符:包括字母、数字和一些特殊字符,它们以字面值的方式匹配文本。
-
特殊字符:包括元字符,用于表示匹配模式的特殊含义。例如:
.
: 匹配除换行符之外的任意单个字符。^
: 匹配输入的开始位置。$
: 匹配输入的结束位置。\
: 转义字符,用于取消特殊字符的特殊含义,或为特殊字符赋予特殊含义。
-
字符类:用于匹配某个字符集合中的任意一个字符。例如:
[abc]
: 匹配字符"a"、"b"或"c"中的任意一个。[a-z]
: 匹配小写字母"a"到"z"之间的任意一个字符。[^0-9]
: 匹配除了数字之外的任意字符。
-
数量词:用于指定匹配模式出现的次数。例如:
*
: 匹配前一个元素零次或多次。+
: 匹配前一个元素一次或多次。?
: 匹配前一个元素零次或一次。{n}
: 匹配前一个元素恰好出现 n 次。{n,}
: 匹配前一个元素至少出现 n 次。{n,m}
: 匹配前一个元素至少出现 n 次,但不超过 m 次。
-
边界匹配符:用于匹配特定位置,而不是字符。例如:
\b
: 匹配单词的边界。\B
: 匹配非单词的边界。
-
分组和引用:用于对正则表达式的一部分进行分组,并且可以通过反向引用来重复利用。例如:
(pattern)
: 创建一个捕获组。\1
,\2
, ...: 引用捕获组中匹配的内容。
-
预定义字符类:用于匹配常见的字符集合。例如:
\d
: 匹配任何数字字符。\w
: 匹配任何字母数字字符及下划线字符。\s
: 匹配任何空白字符(包括空格、制表符、换行符等)。
3.正则表达式的工作原理
-
编译正则表达式:在使用正则表达式之前,需要将其编译成内部数据结构,以便进行后续的匹配操作。编译过程将正则表达式的字符串形式转换为一个可以被计算机程序理解和处理的数据结构。
-
文本搜索:一旦正则表达式被编译,就可以将其应用于文本数据。搜索过程从文本的起始位置开始,尝试匹配正则表达式中指定的模式。搜索过程中,正则表达式引擎会按照规则逐个字符地检查输入文本,以确定是否存在与模式匹配的部分。
-
模式匹配:在搜索过程中,正则表达式引擎会尝试将输入文本与正则表达式中的模式进行匹配。匹配过程涉及到正则表达式中的特殊字符和量词,以及文本中的实际字符。引擎根据匹配规则逐步尝试匹配文本中的字符,直到找到满足条件的匹配结果或者搜索到文本的末尾。
-
返回匹配结果:如果搜索过程找到了与正则表达式匹配的部分,那么引擎会返回匹配结果,包括匹配的文本、匹配位置等信息。这些匹配结果可以用于后续的操作,例如提取匹配内容、替换文本等。
-
重复匹配:正则表达式通常可以指定多个匹配条件,或者匹配重复出现的模式。在搜索过程中,引擎会尝试匹配所有满足条件的部分,并将其作为匹配结果返回。
总的来说,正则表达式的工作原理是通过模式匹配和文本搜索来实现的。正则表达式引擎根据预定义的规则和模式,从输入文本中找到与之匹配的部分,并返回相应的结果。
4.正则表达式的好处
-
灵活性和表达力:正则表达式提供了丰富的语法和功能,可以描述各种复杂的文本模式,从简单的字符串匹配到复杂的模式匹配和提取。
-
高效性:正则表达式的匹配算法通常经过优化,能够在大量文本数据中快速进行搜索和匹配操作,提高处理效率。
-
通用性:正则表达式是跨平台、跨语言的,几乎所有现代编程语言和文本处理工具都支持正则表达式的使用,使其具有广泛的适用性。
-
模式匹配和替换:正则表达式可以用于查找、匹配和替换文本中的特定模式,使其在数据清洗、文本处理、字符串操作等方面非常有用。
-
规范性:正则表达式是一种标准化的文本匹配语法,具有统一的语法和规则,使得代码更易于阅读、维护和理解。
-
强大的功能:正则表达式支持字符类、数量词、分组、引用等功能,可以实现复杂的模式匹配和文本提取操作。
-
文本验证:正则表达式可以用于验证用户输入的文本是否符合特定的格式要求,如邮箱地址、电话号码、身份证号码等,从而提高数据的准确性和完整性。
-
文本分析和处理:通过正则表达式,可以对文本数据进行分析、提取关键信息、过滤无用信息等,为后续的数据处理和分析提供支持。
总的来说,正则表达式是一种强大而灵活的文本处理工具,具有广泛的应用场景,可以大大简化文本处理和模式匹配的任务,提高代码的效率和可读性。
二、正则表达式的使用
1.创建正则表达式对象:
可以使用 RegExp
构造函数或者字面量语法来创建正则表达式对象。
// 使用字面量语法创建正则表达式对象
let pattern1 = /hello/;
// 使用RegExp构造函数创建正则表达式对象
let pattern2 = new RegExp("hello");
2.字符串匹配:
使用正则表达式的 test()
方法或者 match()
方法来进行字符串匹配。
let pattern = /hello/;
let text = "hello world";
// 使用test()方法进行匹配
if (pattern.test(text)) {
console.log("Match found!");
}
// 使用match()方法进行匹配
let result = text.match(pattern);
console.log(result); // Output: ["hello"]
3.全局匹配:
使用正则表达式的 g
标志进行全局匹配。
let pattern = /hello/g;
let text = "hello world, hello everyone";
// 使用match()方法进行全局匹配
let result = text.match(pattern);
console.log(result); // Output: ["hello", "hello"]
4.文本替换:
使用正则表达式的 replace()
方法进行文本替换。
let pattern = /hello/;
let text = "hello world";
let replacement = "hi";
let result = text.replace(pattern, replacement);
console.log(result); // Output: "hi world"
5.文本搜索和提取:
使用正则表达式的 exec()
方法进行文本搜索和提取。
let pattern = /\d+/g;
let text = "The price is $1000 and the quantity is 5.";
let result;
while ((result = pattern.exec(text)) !== null) {
console.log(result[0]); // Output: "1000", "5"
}
6.字符串分割:
使用正则表达式的 split()
方法进行字符串分割。
let pattern = /[,;]/;
let text = "apple,banana;orange";
let result = text.split(pattern);
console.log(result); // Output: ["apple", "banana", "orange"]
三、正则表达式实例
1.时间格式化
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h2 class="time"></h2>
<script>
//timestamp:1659252290626
// yyyy/MM/dd-hh:mm:ss
// yyyy*MM*dd-hh-mm-ss
function formatTime(timestamp,fmtString){
//1.将时间戳转成Date
const date = new Date(timestamp)
//2,正则和值匹配起来
const dateO = {
"y+":date.getFullYear(),
"M+":date.getMonth() + 1,
"d+":date.getDate(),
"h+":date.getHours(),
"m+":date.getMinutes(),
"s+":date.getSeconds()
}
//3.for循环进行替换
for(const key in dateO){
const keyRe = new RegExp(key)
if(keyRe.test(fmtString)){
const value = (dateO[key] + "").padStart(2,"0")
fmtString = fmtString.replace(keyRe,value)
}
}
return fmtString
}
// 某一个商品上架时间,活动的结束时间
const timeEl = document.querySelector(".time")
const productJSON = {
name:"iphone",
newPrice:4499,
oldPrice:5999,
endTime:1659252290626
}
timeEl.textContent = formatTime(productJSON.endTime,"yyyy/MM/dd hh:mm:ss")
</script>
</body>
</html>
2.歌词解析
// 歌词解析器函数
function parseLyrics(lyricsText) {
// 正则表达式匹配时间标签和歌词文本
var pattern = /\[(\d+):(\d{2})\.(\d{2})\]([\s\S]*?)(?=\[\d+:\d{2}\.\d{2}\]|$)/g;
var lyrics = [];
var match;
// 逐行匹配歌词
while ((match = pattern.exec(lyricsText)) !== null) {
var minutes = parseInt(match[1]);
var seconds = parseInt(match[2]);
var milliseconds = parseInt(match[3]);
var time = minutes * 60 + seconds + milliseconds / 100;
var text = match[4].trim();
lyrics.push({ time: time, text: text });
}
return lyrics;
}
// 歌词文本示例
var lyricsText = `
[00:00.00] 歌词第一行
[00:10.50] 歌词第二行
[00:20.80] 歌词第三行
[01:00.00] 歌词第四行
[01:10.50] 歌词第五行
`;
// 解析歌词文本
var parsedLyrics = parseLyrics(lyricsText);
// 打印解析结果
parsedLyrics.forEach(function(lyric) {
console.log(lyric.time.toFixed(2), lyric.text);
});
四、正则表达式的应用
-
文本搜索与替换: 可以使用正则表达式在文本中搜索特定模式的字符串,并进行替换或其他处理操作。例如,可以通过正则表达式来搜索包含特定关键词的文章段落,并将其替换为其他内容。
-
数据验证: 正则表达式可以用来验证用户输入的数据是否符合特定的格式要求。例如,可以使用正则表达式来验证邮箱地址、手机号码、密码强度等。
-
数据抽取: 可以使用正则表达式从文本中抽取出所需的信息。例如,从网页 HTML 中抽取出链接、标题等内容,从日志文件中抽取出特定格式的日志信息等。
-
语法分析: 正则表达式可以用来进行简单的语法分析,例如解析简单的标记语言(如 Markdown、XML 等)中的内容。
-
字符串处理: 正则表达式可以用来对字符串进行分割、匹配、查找等操作,从而实现复杂的字符串处理功能。
-
日志分析: 在日志分析领域,正则表达式常常用来解析日志文件中的信息,提取出关键指标或异常事件。
-
网页爬虫: 在网页爬虫开发中,正则表达式常用来匹配和提取网页中的链接、文本内容等信息。
-
文本处理工具: 许多文本处理工具(如文本编辑器、代码编辑器等)都支持使用正则表达式进行搜索、替换等操作,提高了用户的效率和便利性。