正则表达式测试器/ 实时匹配
实时高亮匹配结果,显示捕获分组与位置,支持替换模式,内置常用正则模板,内容不上传服务器。
//
常用:
测试文本
在上方输入正则表达式。
这个工具有帮到你吗?
什么是正则表达式测试工具
正则表达式测试工具让开发者可以实时测试和调试正则表达式,即时查看匹配结果、捕获分组和替换效果。它支持全局匹配、大小写忽略、多行模式等常用标志,并提供常见正则模板供快速参考。
正则表达式的常见应用场景
表单验证:验证邮箱、手机号、身份证号等格式。数据提取:从文本中提取特定模式的信息(如 URL、日期)。文本替换:批量替换符合模式的文本。日志分析:筛选符合特定条件的日志行。爬虫开发:从网页中提取结构化数据。
代码示例
JavaScript
const re = /(?<year>\d{4})-(\d{2})/g;
const str = "2024-03 and 2025-01";
for (const m of str.matchAll(re)) {
console.log(m[0]); // "2024-03"
console.log(m.groups.year); // "2024"
console.log(m[2]); // "03"
console.log(m.index); // 0
}Python
import re
pattern = r"(?P<year>\d{4})-(\d{2})"
text = "2024-03 and 2025-01"
for m in re.finditer(pattern, text):
print(m.group(0)) // "2024-03"
print(m.group("year")) // "2024"
print(m.group(2)) // "03"
print(m.start()) // 0Go
import "regexp"
re := regexp.MustCompile(
`(?P<year>\d{4})-(\d{2})`,
)
text := "2024-03 and 2025-01"
matches := re.FindAllStringSubmatch(
text, -1,
)
// matches[0][0] = "2024-03"
// matches[0][1] = "2024" (year)
// matches[0][2] = "03"Rust
use regex::Regex;
let re = Regex::new(
r"(?P<year>\d{4})-(\d{2})"
).unwrap();
let text = "2024-03 and 2025-01";
for cap in re.captures_iter(text) {
println!("{}", &cap[0]); // "2024-03"
println!("{}", &cap["year"]); // "2024"
println!("{}", &cap[2]); // "03"
}常见问题
正则表达式中的标志位有什么作用?
g(global)匹配全部而非只匹配第一个;i(ignore case)忽略大小写;m(multiline)使 ^ 和 $ 匹配每行的开头和结尾;s(dotAll)使 . 也能匹配换行符。
如何引用捕获分组?
用括号 () 创建捕获分组,在替换框中用 $1、$2 引用对应分组。例如正则 (\d{4})-(\d{2}),替换为 $2/$1 可把 2024-03 变成 03/2024。命名分组 (?<name>…) 可用 $<name> 引用。
为什么匹配结果显示「位置」?
位置(index)是匹配内容在原始字符串中的起始字符偏移量,从 0 开始。这在编程中很有用,可直接用于 String.prototype.slice() 或字符串替换操作。
如何匹配中文字符?
匹配单个中文汉字可用 [\u4e00-\u9fff],更宽范围可用 [\u4e00-\u9fff\u3400-\u4dbf\uf900-\ufaff]。启用 u 标志后,可以直接用 \p{Script=Han} 匹配所有汉字(Unicode 属性转义)。
零宽断言是什么?
零宽断言匹配位置而非字符,不占用匹配内容:正向先行断言 (?=…) 要求右侧满足条件;负向先行断言 (?!…) 要求右侧不满足;正向后行断言 (?<=…) 要求左侧满足;负向后行断言 (?<!…) 要求左侧不满足。
为什么我的正则匹配会无限循环?
使用 g 标志时,如果正则可以匹配空字符串(如 a* 或 .*),每次匹配空串后 lastIndex 不会前进,导致死循环。本工具会在匹配空串后自动推进 lastIndex,并限制最多 2000 次匹配以保护浏览器性能。