我收到了这种格式的字符串:
"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 2012
和Visual Studio 2015
都可以正常使用。
但是,如果此代码作为VS 2012
表单代码的一部分在InfoPath 2013
中运行,我会看到以下结果:
ParseExtension
电话:441234567890
ParseTelephoneNumber
441234567890
这是什么原因? InfoPath
是否使用不同的引擎来计算正则表达式?
答案 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引擎。 只要您以相同的格式发送字符串,就应该得到相同的输出。