正则表达式测试工具功能介绍

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.com

Java

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);  // true

PHP

// 查找所有匹配
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 6

Go

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) // true

C#

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: 贪婪模式(默认)会尽可能多地匹配字符,如 .* 会匹配到最后一个符合条件的字符。非贪婪模式在量词后加 ?,如 .*?,会尽可能少地匹配字符。