平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“最新正则表达式、常用的正则大全”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
落到代码里,正则表达式(Regular Expression,简称为Regex或RegExp)是用来匹配和搜索文本模式的工具。它是一个强大且灵活的字符串处理工具,能够用来检查一个字符串是否符合特定的模式,或者从一个文本中提取满足条件的部分。
结合项目来看,在正则表达式里,能够采用不同的元字符和特殊符号来定义模式。以下是一些常用的正则表达式元字符和它们的含义:
.:匹配任意字符,除了换行符。
*:匹配前面的元素零次或多次。
+:匹配前面的元素一次或多次。
?:匹配前面的元素零次或一次。
^:匹配字符串的开始位置。
$:匹配字符串的结束位置。
[]:定义字符集,匹配括号内的任意一个字符。
|:表示逻辑“或”,匹配两个或多个表达式之一。
():分组,将表达式组合为一个子表达式,能够采用 | 和量词对整个组进行操作。用法谈到正则表达式时,还有一些其他重要的概念和用法需了解:
字符类和量词: 在正则表达式里,采用方括号 [] 来定义字符类,它能够匹配方括号内的任意一个字符。比如,[aeiou] 匹配任何一个元音字母。采用花括号 {} 能够指定匹配的次数,比如,a{2,4} 匹配连续两到四个字母 a。
预定义字符类: 从实现思路看,正则表达式提供了一些预定义的字符类,比如,d 匹配任意一个数字,w 匹配任意一个字母或数字,s 匹配任意一个空白字符。
转义字符: 反斜杠 是正则表达式的转义字符,用来转义特殊字符,使其失去特殊含义。比如,. 能够匹配真正的句点而不是匹配任意字符。
贪婪匹配和非贪婪匹配: 从实现思路看,正则表达式默认是贪婪匹配,即尽可能多地匹配字符。非贪婪匹配在量词后加上问号 ?,使其尽可能少地匹配字符。比如,.* 是贪婪匹配,而 .*? 是非贪婪匹配。
边界匹配: 正则表达式能够用 ^ 表示字符串的开始,用 $ 表示字符串的结束。这样能够确保模式匹配必须出现在字符串的开始或结束位置。
替换和捕获: 落到代码里,正则表达式能够用来替换文本中的匹配项,也能够采用括号 () 进行捕获,同时在替换中引用捕获的内容。
修饰符: 在这个场景下,正则表达式通常兼容一些修饰符来修改其行为。比如,i 表示不区分大小写,g 表示全局匹配,m 表示多行匹配等。
从实现思路看,不过,不同的编程语言和工具对正则表达式的兼容可能有所不同,所以在具体应用中需查阅相应的文档和规范。
const regex = new RegExp("pattern",gi);结合项目来看,在 JavaScript 里,正则表达式的构造函数 RegExp 具有以下属性:
true,则正则表达式会匹配所有符合模式的文本,而不是在找到第一个匹配后停止。true,则正则表达式在匹配时会忽略大小写。true,则正则表达式中的 ^ 和 $ 会匹配字符串中每一行的开始和结束位置。true,则正则表达式将会从目标字符串的当前 lastIndex 位置开始匹配。true,则正则表达式会正确处理 Unicode 字符。实际处理时,这些属性能够借助正则表达式对象的构造函数 RegExp 的实例来访问。比如:
const regex = new RegExp("pattern", "gi");
console.log(regex.source); // "pattern"
console.log(regex.global); // true
console.log(regex.ignoreCase); // true
console.log(regex.multiline); // false
console.log(regex.sticky); // false
console.log(regex.unicode); // false
console.log(regex.flags); // "gi"以上代码中的 "pattern" 是一个示例正则表达式的模式字符串,能够根据需替换成实际的正则表达式模式。
理解这一步时,在 JavaScript 里,正则表达式的构造函数 RegExp 以及正则表达式对象都有一些方法能够用来执行不同的操作。以下是常用的正则表达式方法:
1.test(): 在字符串中测试正则表达式是否匹配。得到一个布尔值,表示是否找到匹配项。
const regex = /pattern/;
const text = "This is a pattern test.";
console.log(regex.test(text)); // true
2.exec(): 在这个场景下,在字符串中执行正则表达式搜索,得到匹配结果的数组或 null。该方法得到一个数组,包含匹配到的文本以及捕获组的信息。
const regex = /pattern/g;
const text = "This is a pattern test.";
let match = regex.exec(text);
while (match !== null) {
console.log(match[0]); // 输出匹配到的文本
match = regex.exec(text); // 继续搜索下一个匹配项
}
3.match(): 落到代码里,在字符串中搜索匹配项,得到匹配结果的数组或 null。如果正则表达式带有全局标志 g,则得到所有匹配项的数组。否则,只得到第一个匹配项的数组。
const regex = /pattern/g;
const text = "This is a pattern test.";
const matches = text.match(regex);
console.log(matches); // ["pattern"]
4.search(): 从实现思路看,在字符串中查找匹配项,得到第一个匹配项的索引。如果找不到匹配项,则得到 -1。
const regex = /pattern/;
const text = "This is a pattern test.";
console.log(text.search(regex)); // 10
5.replace(): 在字符串中采用替换文本替换匹配项。
const regex = /pattern/g;
const text = "This is a pattern test.";
const replacedText = text.replace(regex, "replacement");
console.log(replacedText); // "This is a replacement test."
除了 "gi"(全局匹配和忽略大小写)之外,RegExp 构造函数的第二个参数还能够包含其他标志,用来指定正则表达式的附加选项。以下是常用的标志:
g(全局匹配): 查找所有匹配项,而不是在找到第一个匹配项后停止。i(忽略大小写): 在匹配时忽略目标字符串的大小写。m(多行匹配): 开启多行模式。在此模式下,^ 和 $ 会匹配字符串中每一行的开始和结束位置,而不仅仅是整个字符串的开始和结束。s(单行匹配): 开启单行模式。在此模式下,. 能够匹配包括换行符在内的任意字符。u(Unicode 匹配): 开启 Unicode 模式。在此模式下,将正确处理 Unicode 字符。y(粘连匹配): 开启粘连匹配模式。正则表达式将从目标字符串的当前 lastIndex 位置开始匹配。d(具有 dollar 符号的特殊字符): 开启允许采用 $ 符号匹配行尾。实际处理时,这些标志能够单独采用,也能够组合采用。比如,如果需开启全局匹配、忽略大小写和多行匹配,能够采用 "gim"。
注意:
"gi" 和 "ig" 都会开启全局匹配和忽略大小写。new RegExp("pattern", "i") 和 /pattern/i 是等效的,都表示忽略大小写匹配。const reg = /^-?d+(.d+)?$/;
console.log(reg.test(123)); // true
console.log(reg.test(-123)); // true
console.log(reg.test(-12.3)); // true
console.log(reg.test(0)); // true
console.log(reg.test('0aaaaa')); // false
解释:
^ 表示匹配字符串的开始位置。-? 表示可选的负号,即匹配一个或零个减号。d+ 表示匹配一个或多个数字。(.d+)? 表示可选的小数部分,其中 . 表示匹配一个点(小数点),d+ 表示匹配一个或多个数字。$ 表示匹配字符串的结束位置。注意:
(.d+)? 部分,即采用 ^-?d+$。const reg = /^[A-Za-z0-9_]+$/;
console.log(reg.test(123)); // true
console.log(reg.test(-123)); // false
console.log(reg.test('aaa11')); // true
console.log(reg.test('_a')); // true
解释:
^ 表示匹配字符串的开始位置。[A-Za-z0-9_] 表示一个字符类,匹配任意一个大写字母、小写字母、数字或下划线。+ 表示匹配前面的元素一个或多个次数。$ 表示匹配字符串的结束位置。注意:
+ 修改为 *,即采用 ^[A-Za-z0-9_]*$。这样能够允许空字符串的匹配。在这个场景下,要匹配只包含中文、英文字母、数字以及键盘上的特殊字符的正则表达式,能够采用以下模式:
const reg = /^[u4E00-u9FA5A-Za-z0-9`~!@#$%^&*()_-+=[]{}|\:;"'<>,.?/]+$/;解释:
^ 表示匹配字符串的开始位置。[u4E00-u9FA5] 表示匹配中文字符的范围,它包含了常用的中文字符。A-Za-z 表示匹配任意一个大写字母或小写字母。0-9 表示匹配任意一个数字。`~!@#$%^&*()_-+=[]{}|\:;"'<>,.?/` 表示匹配键盘上的特殊字符。+ 表示匹配前面的元素一个或多个次数。$ 表示匹配字符串的结束位置。在这个场景下,这个正则表达式能够匹配只包含中文、英文字母、数字以及键盘上的特殊字符的字符串。
注意:
u4E00-u9FA5 表示中文字符的范围。从实现思路看,要校验密码是否符合规则,通常能够采用正则表达式来检查密码是否满足特定的要求。下面是一个示例正则表达式,用来校验密码是否符合一般的密码规则:
落到代码里,这个正则表达式强制密码必须包含至少一个字母、一个数字和一个特殊字符,同时且密码长度至少为 8 个字符。
const reg =/ ^(?=.*[A-Za-z])(?=.*d)(?=.*[@$!%*?&])[A-Za-zd@$!%*?&]{8,}$/解释:
^ 表示匹配字符串的开始位置。(?=.*[A-Za-z]) 表示采用正向肯定预查来确保密码中包含至少一个字母(大小写均可)。(?=.*d) 表示采用正向肯定预查来确保密码中包含至少一个数字。(?=.*[@$!%*?&]) 表示采用正向肯定预查来确保密码中包含至少一个特殊字符(能够根据需扩展特殊字符的范围)。[A-Za-zd@$!%*?&]{8,} 表示匹配至少包含 8 个以上字符的字母、数字和特殊字符的组合。$ 表示匹配字符串的结束位置。请根据自己的密码需求更改正则。
校验 HTTP 或 HTTPS 端口号的正则表达式能够采用以下模式:
const reg = /^(http|https)://(www.)?[A-Za-z0-9]+.[A-Za-z]+(:[0-9]+)?$/
解释:
^ 表示匹配字符串的开始位置。(http|https) 表示匹配 “http” 或 “https” 中的一个。:// 表示匹配 “/”。(www.)? 表示匹配可选的 “www.”,即网址可能有 “www.” 前缀或没有。[A-Za-z0-9]+ 表示匹配至少一个字母或数字。. 表示匹配点(用来域名部分的分隔)。[A-Za-z]+ 表示匹配至少一个字母(用来域名的顶级域部分)。(:[0-9]+)? 表示匹配可选的冒号加上至少一个数字,用来表示端口号。$ 表示匹配字符串的结束位置。这个正则表达式能够匹配以下样例:
(链接已移除)(链接已移除)(链接已移除)(链接已移除)请注意:
校验端口号是否正确的正则表达式如下所示:
const reg =/^(0|([1-9]d{0,3})|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])$/解释:这个正则表达式用来校验端口号是否正确。它能够匹配范围在 0 到 65535 的合法端口号。端口号是一个 16 位无符号整数。
正则表达式的具体规则如下所示:
^ 表示匹配字符串的开始位置。0 匹配端口号为 0 的情况。[1-9]d{0,3} 匹配端口号在 1 到 9999 之间的情况。[1-5]d{4} 匹配端口号在 10000 到 59999 之间的情况。6[0-4]d{3} 匹配端口号在 60000 到 64999 之间的情况。65[0-4]d{2} 匹配端口号在 65000 到 65499 之间的情况。655[0-2]d 匹配端口号在 65500 到 65529 之间的情况。6553[0-5] 匹配端口号在 65530 到 65535 之间的情况。$ 表示匹配字符串的结束位置。从实现思路看,这个正则表达式能够用来验证端口号是否在 0 到 65535 的范围内,是否为合法的端口号。
在这个场景下,要校验是否是正确的 IP 地址(IPv4 或 IPv6),能够采用以下两个正则表达式分别进行匹配:
IPv4 地址的正则表达式:
const reg = /^(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})(.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})){3}$/;IPv6 地址的正则表达式:
const reg = /^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/;解释:
IPv4 地址的正则表达式:
^ 表示匹配字符串的开始位置。(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}) 表示匹配 0 到 255 之间的数字,考虑到前导零的情况。. 表示匹配点。(.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})){3} 表示匹配三个点隔开的数字段。$ 表示匹配字符串的结束位置。这个正则表达式能够校验 IPv4 地址是否合法。
IPv6 地址的正则表达式:
^ 表示匹配字符串的开始位置。([0-9a-fA-F]{1,4}:){7} 表示匹配 7 组以冒号分隔的 16 进制数。[0-9a-fA-F]{1,4} 表示匹配一个 16 进制数。$ 表示匹配字符串的结束位置。这个正则表达式能够校验 IPv6 地址是否合法。
在这个场景下,请注意,正则表达式仅能够校验 IP 地址的格式是否正确,无法判断其是否为真实可用的 IP 地址。如果需对 IP 地址进行更严格的验证,能够在代码中进一步检查 IP 地址的有效性。
这里给到的示例只针对中国大陆采用的:
const regPhone = /^+?[0-9s-]+$/; // 电话号码
const regId = /^[1-9]d{5}(18|19|20)d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2]d|3[0-1])d{3}[dX]$/; // 身分证号
const regBank = /^[1-9]d{9,18}$/; //银彳卡号
到此这篇关于最新正则表达式、常用的正则大全的文章就介绍到这了,更多相关常用的正则表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多兼容脚本之家!