JavaScript的正则表达式(Regular Expressions,简称Regex或RegExp)是一种强大的工具,用于匹配字符串中的模式。正则表达式包含许多元字符(Metacharacters),这些元字符用于定义模式的结构。
一、元字符
以下是一些常用的JavaScript正则表达式元字符及其含义:
1. 基本元字符
.
:匹配除换行符之外的任何单个字符。^
:匹配输入字符串的开始位置。$
:匹配输入字符串的结束位置。\b
:匹配单词边界(单词的开头或结尾)。\B
:匹配非单词边界。
2. 字符类
[...]
:匹配字符集中的任何一个字符。例如,[abc]
匹配a
、b
或c
。[^...]
:匹配不在字符集中的任何一个字符。例如,[^abc]
匹配除了a
、b
、c
之外的任何一个字符。\d
:匹配任何一个数字字符(等价于[0-9]
)。\D
:匹配任何一个非数字字符(等价于[^0-9]
)。\w
:匹配任何一个字母、数字或下划线字符(等价于[A-Za-z0-9_]
)。\W
:匹配任何一个非字母、数字或下划线字符(等价于[^A-Za-z0-9_]
)。\s
:匹配任何一个空白字符(包括空格、制表符、换页符等)。\S
:匹配任何一个非空白字符。
3. 量词
*
:匹配前面的元素零次或多次。+
:匹配前面的元素一次或多次。?
:匹配前面的元素零次或一次。{n}
:匹配前面的元素正好 n 次。{n,}
:匹配前面的元素至少 n 次。{n,m}
:匹配前面的元素至少 n 次,但不超过 m 次。
4. 分组和捕获
(...)
:分组并捕获匹配的子表达式。(?:...)
:分组但不捕获匹配的子表达式。(?=...)
:正向前瞻,匹配但不在结果中包含。(?!...)
:负向前瞻,匹配但不在结果中包含。(?<=...)
:正向后顾,匹配但不在结果中包含。(?<!...)
:负向后顾,匹配但不在结果中包含。
5. 常用转义字符
\\
:匹配反斜杠字符。\n
:匹配换行符。\t
:匹配制表符。\r
:匹配回车符。\f
:匹配换页符。
6. 其他元字符
|
:或操作符,匹配两者之一。例如,a|b
匹配a
或b
。
7. 示例:
为了更好地理解这些正则表达式元字符和方法,我们可以通过具体的JavaScript实例来说明。
实例1: 使用 .
, ^, 和 $
let str = "hello";
// 使用 . 匹配任意字符
console.log(/./.test(str)); // true,因为 . 可以匹配任意字符
// 使用 ^ 匹配字符串开始的位置
console.log(/^h/.test(str)); // true,因为字符串以 'h' 开头
// 使用 $ 匹配字符串结束的位置
console.log(/o$/.test(str)); // true,因为字符串以 'o' 结尾
实例2: 使用 \w
, \W
, \d
, \D
, \s
, \S
let str = "Hello_123!";
// 使用 \w 匹配数字、字母和下划线
console.log(/\w/.test(str)); // true,因为 'H' 是字母
// 使用 \W 匹配非数字和字母
console.log(/\W/.test(str)); // true,因为 '!' 是非数字和字母
// 使用 \d 匹配数字
console.log(/\d/.test(str)); // true,因为 '1' 是数字
// 使用 \D 匹配非数字
console.log(/\D/.test(str)); // true,因为 'H' 是非数字
// 使用 \s 匹配空白字符
console.log(/\s/.test(str)); // false,因为没有空白字符
// 使用 \S 匹配非空白字符
console.log(/\S/.test(str)); // true,因为 'H' 是非空白字符
实例3: 使用 []
, [^a-z]
, +
, *
, ?
let str = "Hello123!";
// 使用 [] 匹配里面的任意字符
console.log(/[a-z]/.test(str)); // true,因为 'e' 是小写字母
// 使用 [^a-z] 匹配除a到z之外的所有字符
console.log(/[^a-z]/.test(str)); // true,因为 'H' 不是小写字母
// 使用 + 匹配重复一次或者多次
console.log(/l+/.test(str)); // true,因为 'll' 是重复的 'l'
// 使用 * 匹配重复0次或者多次
console.log(/x*/.test(str)); // true,因为 'x' 可以重复0次
// 使用 ? 匹配重复1次或者是0次
console.log(/H?/.test(str)); // true,因为 'H' 出现1次
实例4: 使用 ()
, |
, ?:
, ?=
, ?!
, ?<=
, ?<!
, {4,8}
let str = "Hello123!";
// 使用 () 分组匹配
console.log(/(l)/.test(str)); // true,因为 'l' 被分组匹配
// 使用 | 或者
console.log(/H|e/.test(str)); // true,因为 'H' 或 'e' 存在
// 使用 ?: 分组匹配不捕获
console.log(/(?:l)/.test(str)); // true,但不会捕获 'l'
// 使用 ?= 正向肯定预查
console.log(/H(?=e)/.test(str)); // true,因为 'H' 后面是 'e',但不匹配 'e'
// 使用 ?! 正向否定预查
console.log(/H(?!x)/.test(str)); // true,因为 'H' 后面不是 'x'
// 使用 ?<= 反向肯定预查
console.log(/(?<=H)e/.test(str)); // true,因为 'e' 前面是 'H',但不匹配 'H'
// 使用 ?<! 反向否定预查
console.log(/(?<!x)e/.test(str)); // true,因为 'e' 前面不是 'x'
// 使用 {4,8} 最少4位 最多8位匹配
console.log(/[a-z]{4,8}/.test(str)); // true,因为 'Hello' 符合4到8位的条件
实例5: 使用 test()
, exec()
, match()
, search()
, replace()
let str = "Hello, World!";
// 使用 test()
console.log(/Hello/.test(str)); // true,因为 'Hello' 存在于字符串中
// 使用 exec()
let result = /Hello/.exec(str);
console.log(result); // ["Hello"],返回匹配的数组
// 使用 match()
console.log(str.match(/Hello/)); // ["Hello"],返回匹配的数组
// 使用 search()
console.log(str.search(/Hello/)); // 0,返回第一个匹配的位置
// 使用 replace()
console.log(str.replace(/Hello/, "Hi")); // "Hi, World!",替换了 'Hello' 为 'Hi'
这些实例展示了如何使用JavaScript中的正则表达式来匹配和操作字符串。理解这些元字符和方法可以帮助你更有效地处理字符串操作。
二、正则表达式案例
1. 检查用户名格式
<script>
function checkUser(str) {
// 模式
var re = /^[a-zA-Z][a-zA-Z0-9_]{3,15}$/g;
if (re.test(str)) {
return '正确';
} else {
return '错误';
}
}
console.log(checkUser('h111')); // 正确
console.log(checkUser('1h111')); // 错误
</script>
2. 检查邮箱格式
<script>
function checkEmail(str) {
// 模式
var re = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/g;
if (re.test(str)) {
return '正确';
} else {
return '错误';
}
}
console.log(checkEmail('example@example.com')); // 正确
console.log(checkEmail('example@example')); // 错误
</script>
3. 检查电话号码格式(仅限数字)
<script>
function checkPhone(str) {
// 模式
var re = /^\d{10}$/g;
if (re.test(str)) {
return '正确';
} else {
return '错误';
}
}
console.log(checkPhone('1234567890')); // 正确
console.log(checkPhone('123456789')); // 错误
</script>
4. 检查密码格式(至少一个大写字母、一个小写字母、一个数字、一个特殊字符,长度为8到20)
<script>
function checkPassword(str) {
// 模式
var re = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,20}$/g;
if (re.test(str)) {
return '正确';
} else {
return '错误';
}
}
console.log(checkPassword('Password1!')); // 正确
console.log(checkPassword('password')); // 错误
</script>
5. 检查URL格式
<script>
function checkURL(str) {
// 模式
var re = /^(http|https):\/\/[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/g;
if (re.test(str)) {
return '正确';
} else {
return '错误';
}
}
console.log(checkURL('http://example.com')); // 正确
console.log(checkURL('example.com')); // 错误
</script>
6. 检查日期格式(YYYY-MM-DD)
<script>
function checkDate(str) {
// 模式
var re = /^\d{4}-\d{2}-\d{2}$/g;
if (re.test(str)) {
return '正确';
} else {
return '错误';
}
}
console.log(checkDate('2024-10-07')); // 正确
console.log(checkDate('2024-10-7')); // 错误
</script>
7. 检查IP地址格式
<script>
function checkIP(str) {
// 模式
var re = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/g;
if (re.test(str)) {
// 进一步检查每个部分是否在0到255之间
var parts = str.split('.');
if (parts.every(part => part >= 0 && part <= 255)) {
return '正确';
} else {
return '错误';
}
} else {
return '错误';
}
}
console.log(checkIP('192.168.1.1')); // 正确
console.log(checkIP('192.168.1')); // 错误
console.log(checkIP('256.168.1.1')); // 错误
</script>