正则表达式不起作用

Regular Expression not Working

我收到了一些这种格式的字符串:

"tel:+441234567890;ext=7890"

为了提取不同的数字,我通常使用这些正则表达式模式,return 显示的输出:

解析电话号码

public static string ParseTelephoneNumber(string rawInput)
{
    var temp = Regex.Replace(rawInput, ";.*", "");
    return Regex.Replace(temp, ".*:", "");
}

+441234567890

解析扩展

public static string ParseExtension(string rawInput)
{
    return Regex.Replace(rawInput, ".*=", "");
}

7890


这似乎在 Visual Studio 2012Visual Studio 2015 中都能正常工作。

但是,如果此代码作为 InfoPath 2013 表单代码的一部分在 VS 2012 中运行,我将看到以下结果:

ParseExtension

tel:+441234567890

ParseTelephoneNumber

+441234567890

这是什么原因? InfoPath 是否使用不同的引擎来计算正则表达式?

如果您的字符串格式每次都是这样,那么为什么要使用任何类型的替换,只需使用组捕获值即可获得您需要的值。

public static string ParseTelephoneNumber(string rawInput)
{
    var pattern = "tel:(.*?);ext=\d+";
    var match = Regex.Match(rawInput, pattern);
    return match.Groups[1].Value;
}

public static string ParseExtension(string rawInput)
{
    var pattern = "tel:.*?;ext=(\d+)";
    var match = Regex.Match(rawInput, pattern);
    return match.Groups[1].Value;
}

你的原始字符串在 InfoPath 中是不可变的吗?我假设不是,这就是你看到这种行为的原因,
如果不是,你确定 InfoPath 正在以相同的格式将字符串传递给你的C#代码 否则你能试试下面这样的东西吗?

public static Tuple<string, string> ParseTelephoneAndExtension(string rawInput)
{
    var match = Regex.Match(rawInput, @"tel:(\+\d+);ext=(\d+)");
    if (match.Success)
    {
        return new Tuple<string, string>(match.Groups[1].Value, match.Groups[2].Value);
    }
    return new Tuple<string, string>(null, null);
}

此外,正则表达式不依赖于 VS,它更像是一个 .NET 引擎。 只要以相同的格式发送字符串,就应该得到相同的输出。