基本概念
正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。一个正则表达式是一种从左到右匹配主体字符串的模式,常使用缩写的术语“regex”或“regexp”。
常用元字符
元字符 | 描述 |
---|---|
. |
匹配任意单个字符(除了换行符) |
^ |
匹配字符串的开始位置 |
$ |
匹配字符串的结束位置 |
* |
匹配前面的子表达式零次或多次 |
+ |
匹配前面的子表达式一次或多次 |
? |
匹配前面的子表达式零次或一次 |
\d |
匹配一个数字字符,等价于[0-9] |
\w |
匹配字母、数字或下划线,等价于[A-Za-z0-9_] |
\s |
匹配任何空白字符(空格、制表符、换行符等) |
[ ] |
字符集合,匹配所包含的任意一个字符 |
[^ ] |
负值字符集合,匹配未包含的任意字符 |
{n} |
匹配前面的子表达式恰好n次 |
{n,} |
匹配前面的子表达式至少n次 |
{n,m} |
匹配前面的子表达式至少n次,至多m次 |
` | ` |
( ) |
分组,将多个字符组合为一个单元 |
常用正则表达式示例
-
邮箱地址:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
-
URL:
^https?://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
-
手机号码(中国):
^1[3-9]\d{9}$
-
身份证号(18位):
^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$
-
日期(YYYY-MM-DD):
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
在不同语言中的使用
Python
import re
pattern = r'\d+' # 匹配一个或多个数字
text = "There are 123 apples and 456 oranges."
# 查找所有匹配
matches = re.findall(pattern, text) # 返回 ['123', '456']
# 替换
new_text = re.sub(pattern, "NUM", text) # "There are NUM apples and NUM oranges."
JavaScript
const pattern = /\d+/g;
const text = "There are 123 apples and 456 oranges.";
// 查找所有匹配
const matches = text.match(pattern); // 返回 ["123", "456"]
// 替换
const newText = text.replace(pattern, "NUM"); // "There are NUM apples and NUM oranges."
进阶技巧
-
非贪婪匹配: 在
*
或+
后加?
表示非贪婪匹配<.*?> # 匹配最短的HTML标签
-
正向预查和负向预查:
(?=pattern)
正向肯定预查(?!pattern)
正向否定预查(?<=pattern)
反向肯定预查(?<!pattern)
反向否定预查
-
分组捕获:
(\d{4})-(\d{2})-(\d{2}) # 匹配日期并分别捕获年、月、日
评论区