.NET正则表达式匹配和替换

4

我的任务是使用正则表达式验证一个字符串,如果匹配成功则执行替换操作,否则抛出异常。

显然,我可以先使用Regex.IsMatch验证是否匹配成功,然后再调用Regex.Replace进行替换,或者抛出异常:

var str = "89991112233";
var pattern = @"(?<prefix>8|\+?\d+)\s*(?<code>\d{3,3})\s*(?<phone>\d{7,7})";
var replace = "+7 ${code} ${phone}";

if (!Regex.IsMatch(str, pattern))
    throw new Exception();
else
    return Regex.Replace(str, pattern, replace);

但是它需要进行两个相同的匹配操作。

在.Net中,我可以执行正则表达式检查并在单个调用中获取字符串是否匹配和替换吗?

1个回答

4

如果有匹配,您可以设置一个标志并将其设置为true,然后检查该标志是否被设置来决定是抛出异常还是返回字符串:

var str = "89991112233";
var pattern = @"^(?<prefix>8|\+?\d+)\s*(?<code>\d{3})\s*(?<phone>\d{7})\z";
var matched = false;
var result = Regex.Replace(str, pattern, m => {
    matched = !matched;
    return $"+7 ({m.Groups["code"].Value}) {m.Groups["phone"].Value}";
});
if (!matched)
    throw new Exception();
else
    return result;

同时需要注意的是,如果要使用正则表达式来匹配一个完整的字符串,你需要添加锚定符号,我在开头添加了 ^ ,在结尾添加了 \z

另外,{3,3} 等同于 {3}{7,7} 等同于 {7}


谢谢你的建议,Wiktor!但是,实际上,当替换结果等于原始字符串时,这种情况被认为是可能的正常结果,不应该引发异常。此外,在匹配后,仍需要进行额外的检查。 - obratim
@obratim 我已经更新了答案,你需要检查是否在匹配评估器中至少有一个匹配。然而,我怀疑你的当前正则表达式能否匹配输入字符串。我的先前解决方案在修订历史记录中可用(检查新字符串是否与旧字符串相同)。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接