JavaScript 正则表达式复习笔记
一、正则表达式简介
- 正则表达式是一种用于匹配字符串模式的强大工具。在 JavaScript 中,正则表达式可以用于字符串的搜索、替换和验证等操作。
二、创建正则表达式
1. 使用正则表达式字面量
- 语法:
/pattern/flags
,其中pattern
是正则表达式的模式,flags
是可选的标志,用于指定正则表达式的行为。 - 实例:
let pattern = /abc/;
console.log(pattern.test("abcdef")); // 输出:true
2. 使用 RegExp
构造函数
- 语法:
new RegExp(pattern, flags)
,其中pattern
和flags
的含义与字面量形式相同。 - 实例:
let pattern = new RegExp("abc");
console.log(pattern.test("abcdef")); // 输出:true
三、正则表达式的模式
1. 字符匹配
- 可以直接使用字符来匹配字符串中的特定字符。
- 实例:
let pattern = /a/;
console.log(pattern.test("apple")); // 输出:true
2. 字符集
- 使用
[ ]
来定义一个字符集,可以匹配其中的任意一个字符。 - 实例:
let pattern = /[abc]/;
console.log(pattern.test("apple")); // 输出:true
console.log(pattern.test("banana")); // 输出:false
3. 重复匹配
- 使用
{}
来指定重复的次数。例如,{n}
表示重复 n 次,{n,}
表示重复至少 n 次,{n,m}
表示重复 n 到 m 次。 - 实例:
let pattern = /a{3}/;
console.log(pattern.test("aaab")); // 输出:true
console.log(pattern.test("aaa")); // 输出:true
console.log(pattern.test("aab")); // 输出:false
4. 量词
- 使用
?
表示 0 次或 1 次,*
表示 0 次或多次,+
表示 1 次或多次。 - 实例:
let pattern = /a?b/;
console.log(pattern.test("b")); // 输出:true
console.log(pattern.test("ab")); // 输出:true
console.log(pattern.test("aab")); // 输出:false
let pattern2 = /a*b/;
console.log(pattern2.test("b")); // 输出:true
console.log(pattern2.test("ab")); // 输出:true
console.log(pattern2.test("aab")); // 输出:true
console.log(pattern2.test("aaaaab")); // 输出:true
let pattern3 = /a+b/;
console.log(pattern3.test("b")); // 输出:false
console.log(pattern3.test("ab")); // 输出:true
console.log(pattern3.test("aab")); // 输出:true
console.log(pattern3.test("aaaaab")); // 输出:true
5. 分组
- 使用
( )
来进行分组,可以对一组字符进行重复或其他操作。 - 实例:
let pattern = /(ab)+c/;
console.log(pattern.test("abc")); // 输出:false
console.log(pattern.test("ababc")); // 输出:true
console.log(pattern.test("abababc")); // 输出:true
6. 选择
- 使用
|
来表示选择,可以匹配多个模式中的任意一个。 - 实例:
let pattern = /apple|banana/;
console.log(pattern.test("apple")); // 输出:true
console.log(pattern.test("banana")); // 输出:true
console.log(pattern.test("orange")); // 输出:false
四、正则表达式的标志
1. g
(全局匹配)
- 用于在整个字符串中进行全局匹配,而不是在找到第一个匹配后就停止。
- 实例:
let pattern = /a/g;
let str = "apple banana";
let matches = str.match(pattern);
console.log(matches); // 输出:["a", "a"]
2. i
(忽略大小写)
- 使正则表达式在匹配时忽略大小写。
- 实例:
let pattern = /a/i;
console.log(pattern.test("Apple")); // 输出:true
3. m
(多行匹配)
- 使正则表达式可以在多行字符串中进行匹配,
^
和$
可以匹配每行的开头和结尾。 - 实例:
let pattern = /^a/m;
let str = "apple\nbanana";
let matches = str.match(pattern);
console.log(matches); // 输出:["a"]
五、正则表达式的方法
1. test()
- 用于测试一个字符串是否匹配正则表达式,返回一个布尔值。
- 实例:
let pattern = /abc/;
console.log(pattern.test("abcdef")); // 输出:true
2. match()
- 用于在字符串中查找匹配正则表达式的部分,返回一个数组或 null。
- 实例:
let pattern = /a(bc)/;
let str = "abcdef";
let matches = str.match(pattern);
console.log(matches); // 输出:["abc", "bc"]
3. replace()
- 用于在字符串中替换匹配正则表达式的部分。
- 实例:
let pattern = /apple/;
let str = "I like apples.";
let newStr = str.replace(pattern, "oranges");
console.log(newStr); // 输出:"I like oranges."
4. split()
- 用于根据正则表达式将字符串分割成数组。
- 实例:
let pattern = /,/;
let str = "apple,banana,orange";
let arr = str.split(pattern);
console.log(arr); // 输出:["apple", "banana", "orange"]
通过以上的笔记和实例,可以更好地理解和使用 JavaScript 中的正则表达式。正则表达式在处理字符串操作时非常强大,可以大大提高开发效率。
用正则表达式匹配电子邮箱地址的代码示例
// 定义验证电子邮箱的正则表达式
const emailRegExp = /^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/;
// 一些测试的电子邮箱地址示例
const validEmails = [
"example@example.com",
"user_123@domain.co.uk",
"john.doe+tag@company.io"
];
const invalidEmails = [
"example@.com", // 缺少域名部分
"example.com", // 没有 @ 符号
"@example.com", // 缺少用户名部分
"user@domain.", // 缺少顶级域名
"user@domain.c" // 顶级域名长度不符合要求
];
// 验证有效电子邮箱地址
validEmails.forEach(email => {
if (emailRegExp.test(email)) {
console.log(`${email} 是有效的电子邮箱地址。`);
} else {
console.log(`${email} 不是有效的电子邮箱地址。`);
}
});
// 验证无效电子邮箱地址
invalidEmails.forEach(email => {
if (emailRegExp.test(email)) {
console.log(`${email} 是有效的电子邮箱地址。`);
} else {
console.log(`${email} 不是有效的电子邮箱地址。`);
}
});
正则表达式解释
-
^
:表示匹配字符串的开始位置,确保从字符串开头进行匹配,避免出现部分匹配的情况(比如在一个长字符串中间出现类似邮箱格式的字符也被误判为邮箱)。 -
[a-zA-Z0-9_.+-]+
:
[ ]
表示字符集,里面列举的字符都是可接受的字符。这里允许出现的字符有大小写字母(a-zA-Z
)、数字(0-9
)以及.
、_
、+
、-
这些特殊字符。+
是量词,表示前面的字符集里的字符可以出现 1 次或多次,也就是用户名部分至少要有 1 个合法字符。例如user
、user_123
、john.doe
等都是符合这部分规则的用户名形式。
-
@
:匹配电子邮箱地址中的@
符号,用于分隔用户名和域名部分。 -
[a-zA-Z0-9-]+
:
- 同样是字符集,这里表示域名部分(在
@
符号后面到.
之前的部分)可以包含大小写字母、数字以及-
符号,并且至少出现 1 次。例如domain
、example-domain
等都是符合要求的域名形式。
- 同样是字符集,这里表示域名部分(在
-
\.
:因为.
在正则表达式中有特殊含义(表示匹配任意字符),所以如果要匹配实际的.
字符,需要使用\
进行转义,这里就是匹配域名中的.
符号,用于分隔域名和顶级域名。 -
[a-zA-Z0-9-.]+
:
- 字符集内指定了顶级域名(在最后一个
.
后面的部分)可以出现的字符,包括大小写字母、数字、-
和.
,同样至少出现 1 次。像com
、co.uk
、io
等都是常见的顶级域名形式,都能被这个规则匹配到。
- 字符集内指定了顶级域名(在最后一个
-
$
:表示匹配字符串的结束位置,确保整个字符串完全符合电子邮箱地址的格式要求,而不是更长字符串中的一部分符合格式就判定为邮箱地址。
通过这样的正则表达式,就能比较准确地验证一个字符串是否是合法的电子邮箱地址了。不过要注意,实际应用中电子邮箱地址的格式规范非常复杂,这个正则表达式只是覆盖了常见的、基本的合法格式情况,可能存在一些非常特殊的邮箱格式无法准确验证,但对于大多数常规使用场景是足够的。