正则表达式不起作用

时间:2016-10-05 10:49:28

标签: c# regex visual-studio-2012 infopath

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

"tel:+441234567890;ext=7890"

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

ParseTelephoneNumber

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

441234567890

ParseExtension

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

7890

这似乎在Visual Studio 2012Visual Studio 2015都可以正常使用。

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

ParseExtension

  

电话:441234567890

ParseTelephoneNumber

  

441234567890

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

2 个答案:

答案 0 :(得分:1)

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

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;
}

答案 1 :(得分:1)

您的原始字符串是否在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引擎。 只要您以相同的格式发送字符串,就应该得到相同的输出。