2016-10-05 9 views
2

Я получаю некоторые строки в следующем формате:Регулярное выражение не работает

"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, ".*=", ""); 
} 

Это, кажется, работает хорошо в обоих Visual Studio 2012 и Visual Studio 2015.

Однако, если этот код работает в VS 2012 как часть кода для InfoPath 2013 формы, я вижу эти результаты:

ParseExtension

тел: +441234567890

ParseTelephoneNumber

+441234567890

В чем причина этого? Использует ли InfoPath другой двигатель для расчета регулярных выражений?

+3

'Regex' является частью .NET. InfoPath не меняет своего поведения. Вы уверены, что то, что вы видите на экране, является тем, что передается методу? Возможно ли, например, введенная строка HTML? –

ответ

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. Пока вы отправляете строку в том же формате, вы должны получить тот же результат.

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