正则表达式测试工具
在线测试和调试正则表达式,支持多种匹配模式和常用正则预设
正则表达式测试工具功能介绍
TIH Tools 正则表达式测试工具是一款免费的在线工具,帮助开发者快速测试、调试和验证正则表达式。支持全局匹配、忽略大小写、多行模式等多种匹配模式,并提供丰富的常用正则表达式预设。
主要功能
- 实时匹配测试:输入正则表达式和测试文本,即时查看匹配结果
- 多种匹配模式:支持 g(全局匹配)、i(忽略大小写)、m(多行模式)、s(单行模式)
- 匹配详情展示:显示每个匹配项的文本、位置和长度
- 常用正则预设:内置手机号、邮箱、URL、日期等常用正则表达式
- 错误提示:自动检测正则表达式语法错误并提示
常用正则表达式示例
手机号码验证
^1[3-9]\d{9}$匹配中国大陆手机号码,以1开头,第二位为3-9,共11位数字
邮箱地址验证
^[\w.-]+@[\w.-]+\.\w+$匹配标准邮箱格式,支持字母、数字、点号和下划线
URL 链接匹配
https?://[\w.-]+(?:/[\w./-]*)?匹配 HTTP 和 HTTPS 协议的网址链接
日期格式匹配
\d{4}[-/]\d{1,2}[-/]\d{1,2}匹配 YYYY-MM-DD 或 YYYY/MM/DD 格式的日期
身份证号码
^\d{17}[\dXx]$匹配18位身份证号码,最后一位可以是数字或X
IP 地址匹配
^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$匹配标准 IPv4 地址格式
中文字符匹配
[\u4e00-\u9fa5]+匹配一个或多个中文字符
密码强度验证
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$至少8位,包含大小写字母和数字
正则表达式语法参考
| 元字符 | 说明 | 示例 |
|---|---|---|
. | 匹配任意单个字符(除换行符) | a.c 匹配 "abc"、"a1c" 等 |
\d | 匹配任意数字,等价于 [0-9] | \d+ 匹配 "123"、"456" 等 |
\w | 匹配字母、数字、下划线 | \w+ 匹配 "hello_123" |
\s | 匹配空白字符(空格、制表符等) | \s+ 匹配连续空白 |
^ | 匹配字符串开头 | ^Hello 匹配开头的 "Hello" |
$ | 匹配字符串结尾 | world$ 匹配结尾的 "world" |
* | 匹配前一个字符0次或多次 | ab*c 匹配 "ac"、"abc"、"abbc" 等 |
+ | 匹配前一个字符1次或多次 | ab+c 匹配 "abc"、"abbc" 等 |
? | 匹配前一个字符0次或1次 | colou?r 匹配 "color"、"colour" |
{n} | 匹配前一个字符恰好n次 | a{3} 匹配 "aaa" |
{n,m} | 匹配前一个字符n到m次 | a{2,4} 匹配 "aa"、"aaa"、"aaaa" |
[abc] | 匹配方括号中的任意一个字符 | [aeiou] 匹配任意元音字母 |
[^abc] | 匹配不在方括号中的任意字符 | [^0-9] 匹配非数字字符 |
() | 分组,捕获匹配内容 | (ab)+ 匹配 "ab"、"abab" 等 |
| | 或运算,匹配左边或右边 | cat|dog 匹配 "cat" 或 "dog" |
编程语言中使用正则表达式
JavaScript
// 创建正则表达式
const regex1 = /hello/gi; // 字面量方式
const regex2 = new RegExp('hello', 'gi'); // 构造函数方式
// 测试是否匹配
const str = 'Hello World';
console.log(/hello/i.test(str)); // true
// 查找匹配结果
const matches = str.match(/o/g);
console.log(matches); // ['o', 'o']
// 查找所有匹配(包含捕获组)
const regex = /(\w+)@(\w+)\.(\w+)/g;
const text = 'test@example.com and admin@demo.org';
let match;
while ((match = regex.exec(text)) !== null) {
console.log(match[0], match[1], match[2], match[3]);
}
// 替换
const result = 'Hello World'.replace(/world/i, 'JavaScript');
console.log(result); // 'Hello JavaScript'
// 使用回调函数替换
const replaced = '1 2 3'.replace(/\d/g, m => parseInt(m) * 2);
console.log(replaced); // '2 4 6'
// 分割字符串
const parts = 'a1b2c3'.split(/\d/);
console.log(parts); // ['a', 'b', 'c', '']Python
import re
# 编译正则表达式
pattern = re.compile(r'\d+')
# 查找所有匹配
text = 'abc 123 def 456'
matches = pattern.findall(text)
print(matches) # ['123', '456']
# 查找第一个匹配
match = re.search(r'(\w+)@(\w+)\.(\w+)', 'test@example.com')
if match:
print(match.group(0)) # test@example.com
print(match.group(1)) # test
# 匹配开头
match = re.match(r'hello', 'hello world')
if match:
print('Matched!')
# 替换
result = re.sub(r'\d+', 'NUM', 'abc 123 def 456')
print(result) # 'abc NUM def NUM'
# 分割
parts = re.split(r'\d+', 'a1b2c3')
print(parts) # ['a', 'b', 'c', '']
# 使用命名捕获组
pattern = re.compile(r'(?P<name>\w+)@(?P<domain>\w+\.\w+)')
match = pattern.search('test@example.com')
print(match.group('name')) # test
print(match.group('domain')) # example.comJava
import java.util.regex.*;
// 编译正则表达式
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher("abc 123 def 456");
// 查找所有匹配
while (matcher.find()) {
System.out.println(matcher.group());
}
// 查找第一个匹配
Matcher m = Pattern.compile("(\\w+)@(\\w+)\\.(\\w+)")
.matcher("test@example.com");
if (m.find()) {
System.out.println(m.group(0)); // test@example.com
System.out.println(m.group(1)); // test
}
// 替换
String result = "abc 123 def".replaceAll("\\d+", "NUM");
System.out.println(result); // abc NUM def
// 分割
String[] parts = "a1b2c3".split("\\d+");
// parts = ["a", "b", "c", ""]
// 验证匹配
boolean matches = Pattern.matches("\\d{11}", "13812345678");
System.out.println(matches); // truePHP
// 查找所有匹配
preg_match_all('/\d+/', 'abc 123 def 456', $matches);
print_r($matches[0]); // ['123', '456']
// 查找第一个匹配
if (preg_match('/(\w+)@(\w+)\.(\w+)/', 'test@example.com', $m)) {
echo $m[0]; // test@example.com
echo $m[1]; // test
}
// 替换
$result = preg_replace('/\d+/', 'NUM', 'abc 123 def 456');
echo $result; // abc NUM def NUM
// 分割
$parts = preg_split('/\d+/', 'a1b2c3');
print_r($parts); // ['a', 'b', 'c', '']
// 验证匹配
if (preg_match('/^\d{11}$/', '13812345678')) {
echo 'Valid phone number';
}
// 使用回调函数替换
$result = preg_replace_callback('/\d+/', function($m) {
return intval($m[0]) * 2;
}, '1 2 3');
echo $result; // 2 4 6Go
import "regexp"
// 编译正则表达式
re := regexp.MustCompile(`\d+`)
// 查找所有匹配
matches := re.FindAllString("abc 123 def 456", -1)
fmt.Println(matches) // [123 456]
// 查找第一个匹配
match := re.FindString("abc 123 def")
fmt.Println(match) // 123
// 捕获组
re = regexp.MustCompile(`(\w+)@(\w+)\.(\w+)`)
submatches := re.FindStringSubmatch("test@example.com")
fmt.Println(submatches[0]) // test@example.com
fmt.Println(submatches[1]) // test
// 替换
result := re.ReplaceAllString("abc 123 def 456", "NUM")
fmt.Println(result) // abc NUM def NUM
// 分割
parts := regexp.MustCompile(`\d+`).Split("a1b2c3", -1)
fmt.Println(parts) // [a b c ]
// 验证匹配
matched, _ := regexp.MatchString(`^\d{11}
TIH Tools - 在线工具集合
, "13812345678")
fmt.Println(matched) // trueC#
using System.Text.RegularExpressions;
// 查找所有匹配
var matches = Regex.Matches("abc 123 def 456", @"\d+");
foreach (Match m in matches) {
Console.WriteLine(m.Value);
}
// 查找第一个匹配
Match match = Regex.Match("test@example.com", @"(\w+)@(\w+)\.(\w+)");
if (match.Success) {
Console.WriteLine(match.Value); // test@example.com
Console.WriteLine(match.Groups[1]); // test
}
// 替换
string result = Regex.Replace("abc 123 def", @"\d+", "NUM");
Console.WriteLine(result); // abc NUM def
// 分割
string[] parts = Regex.Split("a1b2c3", @"\d+");
// parts = ["a", "b", "c", ""]
// 验证匹配
bool isMatch = Regex.IsMatch("13812345678", @"^\d{11}quot;);
Console.WriteLine(isMatch); // True
// 使用命名捕获组
Match m = Regex.Match("test@example.com", @"(?<name>\w+)@(?<domain>\w+\.\w+)");
Console.WriteLine(m.Groups["name"]); // test
Console.WriteLine(m.Groups["domain"]); // example.com
Ruby
# 查找所有匹配
matches = "abc 123 def 456".scan(/\d+/)
p matches # ["123", "456"]
# 查找第一个匹配
if match = /(\w+)@(\w+)\.(\w+)/.match("test@example.com")
puts match[0] # test@example.com
puts match[1] # test
end
# 替换
result = "abc 123 def".gsub(/\d+/, "NUM")
puts result # abc NUM def
# 使用块替换
result = "1 2 3".gsub(/\d+/) { |m| m.to_i * 2 }
puts result # 2 4 6
# 分割
parts = "a1b2c3".split(/\d+/)
p parts # ["a", "b", "c", ""]
# 验证匹配
if "13812345678" =~ /^\d{11}$/
puts "Valid phone number"
end
# 命名捕获组
match = /(?<name>\w+)@(?<domain>\w+\.\w+)/.match("test@example.com")
puts match[:name] # test
puts match[:domain] # example.com
Shell / 命令行
# 使用 grep 查找匹配
echo "abc 123 def 456" | grep -oE '\d+'
# 输出: 123
# 456
# 使用 sed 替换
echo "abc 123 def" | sed 's/[0-9]\+/NUM/g'
# 输出: abc NUM def
# 使用 awk
echo "test@example.com" | awk 'match($0, /(\w+)@(\w+)\.(\w+)/) {
print substr($0, RSTART, RLENGTH)
}'
# 使用 perl(更强大的正则支持)
echo "abc 123 def 456" | perl -pe 's/\d+/NUM/g'
# 输出: abc NUM def NUM
# 提取匹配内容
echo "test@example.com" | perl -ne 'print "$1\n" if /(\w+)@/'
# 输出: test
# 验证手机号
echo "13812345678" | grep -qE '^[0-9]{11}#39; && echo "Valid"
常见问题
Q: 什么是正则表达式?
A: 正则表达式(Regular Expression,简称 Regex)是一种用于匹配字符串模式的强大工具。它使用特殊的语法来描述搜索模式,广泛应用于文本搜索、数据验证、字符串替换等场景。
Q: 全局匹配(g 标志)有什么作用?
A: 全局匹配标志 g 会让正则表达式查找所有匹配项,而不是在找到第一个匹配后停止。例如,使用 /\d+/g 可以找到字符串中的所有数字序列。
Q: 如何匹配多行文本?
A: 使用 m 标志可以启用多行模式,此时 ^ 和 $ 会匹配每行的开头和结尾,而不仅仅是整个字符串的开头和结尾。
Q: 正则表达式中的贪婪和非贪婪有什么区别?
A: 贪婪模式(默认)会尽可能多地匹配字符,如 .* 会匹配到最后一个符合条件的字符。非贪婪模式在量词后加 ?,如 .*?,会尽可能少地匹配字符。