

新闻资讯
行业动态Regex.Match 返回空结果不报错是因为匹配失败本身不抛异常,仅返回 Success==false 的 Match 对象;需检查输入内容、RegexOptions 选项、转义写法及 Match/Matches 区别。
Regex.Match 返回空结果却没报错这是最常见的困惑:正则写对了,Regex.Match 却返回 Match.Success == false。根本原因不是语法错误,而是匹配失败本身不抛异常——它只安静地返回一个失败的 Match 对象。
排查要点:
Console.WriteLine(input) 看原始值,避免不可见字符干扰)RegexOptions 选项:中文或换行符常需 RegexOptions.Multiline 或 RegexOptions.Singleline
"\\d+" 才等价于正则里的 \d+;用逐字字符串更安全:@"\d+"
Match() 和 Matches():前者只找第一个,后者返回所有匹配项的集合Regex.Replace 中怎么保留捕获组内容想把 "abc123def" 替换成 "abc[123]def",但直接写 Regex.Replace(s, @"(\d+)", "[123]") 显然不行——得引用捕获内容。
正确做法是用 $1、$2 引用分组:
string input = "abc123def"; string result = Regex.Replace(input, @"(\d+)", "[$1]"); // result == "abc[123]def"
注意:
$0 表示整个匹配项,$1 是第一个捕获组(括号内),不能写成 \1(那是 Regex.Replace 的旧式写法,已不推荐)"(?\\d+)" ,就用 ${num}
$ 时,必须写成 $$,否则会被误认为分组引用RegexOptions.Compiled 一定更快吗不是。它只在**同一正则反复使用上百次以上**时才值得开启。编译会显著增加首次调用开销,并占用更多内存。
适用场景判断:
static readonly Regex + Compiled
Compiled,避免内存泄漏和 JIT 压力典型安全写法:
private static readonly Regex EmailRegex =
new Regex(@"^[a-zA-Z0-9._%+-]+@[a-zA-Z0
-9.-]+\.[a-zA-Z]{2,}$",
RegexOptions.Compiled | RegexOptions.IgnoreCase);Regex.IsMatch 在某些字符串上特别慢常见于含大量重复结构又带回溯的模式,例如 "a+b*" 配对 "aaaaaaaaaa...",可能触发指数级回溯(ReDoS)。
规避方式:
"(a+)+" 比 "a+" 危险得多++、*+)切断回溯:"a++b"
Regex.Match(input, pattern, RegexOptions.None, TimeSpan.FromMilliseconds(100))
Uri.TryCreate,JSON 用 System.Text.Json,比手写正则稳得多正则不是万能胶,尤其当模式变复杂、输入不可控时,边界条件和性能退化往往来得突然。