正则表达式完全指南
正则表达式(Regular Expression,简称 regex 或 regexp)是一种强大的文本处理工具,用于匹配、查找、替换等操作字符串中符合特定模式的文本。它广泛应用于各种编程语言和文本处理工具中,如 Python、JavaScript、grep 等。以下是对正则表达式的全面介绍。
一、基本概念
(一)字符集
字符集是正则表达式中最基本的单元,用于匹配特定的字符。
• 普通字符:大多数字符,如字母(a - z、A - Z)、数字(0 - 9)和标点符号(如 .、,、! 等),在正则表达式中直接表示它们自身。例如,正则表达式 “abc” 可以匹配字符串 “abc”。
• 特殊字符(元字符):一些具有特殊含义的字符,如 .、*、+、?、^、$、|、(、)、[、]、{、}、\ 等。这些字符用于构建复杂的匹配模式。例如,. 可以匹配任意单个字符(除换行符外)。
(二)量词
量词用于指定前面的字符或字符集出现的次数。
• *:匹配前面的字符或字符集 0 次或多次。例如,正则表达式 “a*” 可以匹配 “”(空字符串)、“a”、“aa”、“aaa” 等。
• +:匹配前面的字符或字符集 1 次或多次。例如,正则表达式 “a+” 可以匹配 “a”、“aa”、“aaa” 等,但不能匹配空字符串。
• ?:匹配前面的字符或字符集 0 次或 1 次。例如,正则表达式 “a?” 可以匹配 “”(空字符串)和 “a”。
• {n}:匹配前面的字符或字符集恰好 n 次。例如,正则表达式 “a{3}” 只能匹配 “aaa”。
• {n,}:匹配前面的字符或字符集至少 n 次。例如,正则表达式 “a{2,}” 可以匹配 “aa”、“aaa”、“aaaa” 等。
• {n,m}:匹配前面的字符或字符集至少 n 次,但不超过 m 次。例如,正则表达式 “a{1,3}” 可以匹配 “a”、“aa”、“aaa”,但不能匹配 “aaaa”。
(三)字符类
字符类用于匹配一组特定的字符。
• [abc]:匹配字符集中的任意一个字符。例如,正则表达式 “[abc]” 可以匹配 “a”、“b” 或 “c”。
• [a - c]:匹配指定范围内的任意一个字符。例如,正则表达式 “[a - c]” 可以匹配 “a”、“b” 或 “c”。
• [a - z]:匹配任意一个小写字母。
• [A - Z]:匹配任意一个大写字母。
• [0 - 9]:匹配任意一个数字。
• [a - z A - Z 0 - 9]:匹配任意一个字母或数字。
• [^abc]:匹配不在字符集中的任意一个字符。例如,正则表达式 “[^abc]” 可以匹配除 “a”、“b”、“c” 之外的任意字符。
(四)预定义字符类
预定义字符类是一些常用的字符类的简写形式。
• \d:匹配任意一个数字,等价于 [0 - 9]。
• \D:匹配任意一个非数字字符,等价于 [^0 - 9]。
• \w:匹配任意一个字母、数字或下划线,等价于 [a - z A - Z 0 - 9 _]。
• \W:匹配任意一个非字母、非数字、非下划线字符,等价于 [^a - z A - Z 0 - 9 _]。
• \s:匹配任意一个空白字符,包括空格、制表符、换行符等。
• \S:匹配任意一个非空白字符。
(五)分组和捕获
分组用于将多个字符或字符集组合在一起,作为一个整体进行匹配。捕获用于从匹配的文本中提取子字符串。
• (abc):将 “abc” 作为一个分组进行匹配。例如,正则表达式 “(abc)+” 可以匹配 “abc”、“abcabc”、“abcabcabc” 等。同时,分组还可以用于捕获匹配的子字符串。在大多数编程语言中,可以通过特定的语法(如 $1、\1 等)引用捕获的子字符串。
• (a|b|c):匹配 “a”、“b” 或 “c”。分组内的 | 表示逻辑“或”关系。
(六)边界匹配
边界匹配用于匹配字符串的特定位置。
• ^:匹配字符串的开头。例如,正则表达式 “^abc” 只能匹配以 “abc” 开头的字符串。
• $:匹配字符串的结尾。例如,正则表达式 “abc$” 只能匹配以 “abc” 结尾的字符串。
• \b:匹配单词边界。例如,正则表达式 “\bword\b” 可以匹配独立的单词 “word”,但不能匹配 “wording” 中的 “word”。
• \B:匹配非单词边界。例如,正则表达式 “\Bword\B” 可以匹配 “wording” 中的 “word”,但不能匹配独立的单词 “word”。
二、正则表达式的应用
(一)匹配和查找
在编程语言中,正则表达式通常用于匹配和查找字符串中的特定模式。
• Python 示例:
import re
text = "Hello, world! Hello, Python!"
pattern = "Hello"
# 使用 search 方法查找第一个匹配项
match = re.search(pattern, text)
if match:
print("找到匹配项:", match.group())
else:
print("未找到匹配项")
# 使用 findall 方法查找所有匹配项
matches = re.findall(pattern, text)
print("所有匹配项:", matches)
• JavaScript 示例:
let text = "Hello, world! Hello, JavaScript!";
let pattern = /Hello/;
// 使用 test 方法检测是否存在匹配项
if (pattern.test(text)) {
console.log("找到匹配项");
} else {
console.log("未找到匹配项");
}
// 使用 match 方法查找所有匹配项
let matches = text.match(pattern);
console.log("所有匹配项:", matches);
(二)替换和修改
正则表达式还可以用于替换字符串中的特定模式。
• Python 示例:
import re
text = "Hello, world! Hello, Python!"
pattern = "Hello"
replacement = "Hi"
# 使用 sub 方法替换所有匹配项
new_text = re.sub(pattern, replacement, text)
print("替换后的字符串:", new_text)
• JavaScript 示例:
let text = "Hello, world! Hello, JavaScript!";
let pattern = /Hello/g; // 使用全局标志 g 匹配所有项
let replacement = "Hi";
// 使用 replace 方法替换所有匹配项
let new_text = text.replace(pattern, replacement);
console.log("替换后的字符串:", new_text);
(三)验证和格式化
正则表达式常用于验证字符串是否符合特定的格式,如电子邮件地址、电话号码、日期等。
• 电子邮件地址验证:
import re
email = "[email protected]"
pattern = r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"
if re.match(pattern, email):
print("有效的电子邮件地址")
else:
print("无效的电子邮件地址")
• 电话号码验证:
import re
phone = "123-456-7890"
pattern = r"^\d{3}-\d{3}-\d{4}$"
if re.match(pattern, phone):
print("有效的电话号码")
else:
print("无效的电话号码"