2016-10-05 4 views
2

Je reçois des chaînes dans ce format:Expression régulière ne fonctionne pas

"tel:+441234567890;ext=7890" 

Pour extraire les différents numéros, je l'habitude d'utiliser ces modèles regex, qui renvoient la sortie montré:

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

Cela semble fonctionner très bien dans les deux Visual Studio 2012 et Visual Studio 2015.

Cependant, si ce code fonctionne en VS 2012 dans le cadre du code pour une forme InfoPath 2013, je vois ces résultats:

ParseExtension

Tél: +441234567890

ParseTelephoneNumber

+441234567890

Quelle est la raison pour cela? Est-ce que InfoPath utilise un moteur différent pour calculer les expressions régulières?

+3

'Regex' fait partie de .NET. InfoPath ne change pas son comportement. Êtes-vous certain que ce que vous voyez à l'écran est ce qui est passé à la méthode? La chaîne d'entrée HTML est-elle codée peut-être? –

Répondre

1

Est-ce votre chaîne d'origine immuable dans InfoPath Je suppose que non, c'est pourquoi vous voyez ce comportement,
Sinon êtes-vous sûr InfoPath passe la chaîne dans le même format à votre code C# pouvez-vous essayer quelque chose comme ci-dessous?

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

Egalement regex n'est pas dépendante de VS, il s'agit plutôt d'un moteur .NET. Tant que vous envoyez la chaîne dans le même format, vous devriez obtenir la même sortie.

1

Si le format de votre chaîne est comme ça à chaque fois, alors pourquoi utiliser n'importe quel type de remplacement, il suffit de capturer les valeurs en utilisant des groupes pour obtenir ce dont vous avez besoin.

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