【问题标题】:.NET regex match and replace.NET 正则表达式匹配和替换
【发布时间】:2020-10-30 18:53:08
【问题描述】:

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

显然,我可以检查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 中执行正则表达式检查并获取字符串是否匹配以及在单个调用中的替换吗?

【问题讨论】:

    标签: c# .net regex


    【解决方案1】:

    您可以设置一个标志并将其设置为 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}

    【讨论】:

    • 感谢维克托的建议!但是,实际上替换结果等于原始字符串的情况被认为是可能的正常结果,不应引发异常。另外,这种方法在匹配后仍然需要额外的检查。
    • @obratim 我已经更新了答案,您需要检查匹配评估器中是否至少有一个匹配项。但是,我怀疑您是否可以使用当前的正则表达式匹配输入字符串。我之前的解决方案在revision history 中可用(检查新字符串是否与旧字符串相同)。
    猜你喜欢
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 2011-09-15
    • 2012-11-23
    • 2013-12-06
    相关资源
    最近更新 更多