Quelle est l'expression régulière pour vérifier si une chaîne commence par "mailto" ou "ftp" ou "joe" ou ...
Maintenant, j'utilise C # et un code comme celui-ci dans un grand si avec plusieurs ors:
String.StartsWith("mailto:")
String.StartsWith("ftp")
Il semble qu'une regex serait préférable pour cela. Ou y a-t-il un moyen C # qui me manque ici?
Vous pouvez utiliser:
^(mailto|ftp|joe)
Mais pour être honnête, StartsWith
convient parfaitement ici. Vous pouvez le réécrire comme suit:
string[] prefixes = { "http", "mailto", "joe" };
string s = "joe:bloggs";
bool result = prefixes.Any(prefix => s.StartsWith(prefix));
Vous pouvez également consulter la classe System.Uri
si vous analysez des URI.
Ce qui suit correspond à toute chaîne commençant par mailto
, ftp
ou http
:
RegEx reg = new RegEx("^(mailto|ftp|http)");
Pour le décomposer:
^
correspond au début de la ligne(mailto|ftp|http)
correspond à n'importe lequel des éléments séparés par un |
Je trouverais que StartsWith
soit plus lisible dans ce cas.
La méthode StartsWith sera plus rapide, car il n’ya pas de surcharge à interpréter une expression régulière, mais voici comment vous le faites:
if (Regex.IsMatch(theString, "^(mailto|ftp|joe):")) ...
Le ^
définit le début de la chaîne. Vous pouvez mettre tous les protocoles entre les parenthèses séparés par des caractères |
.
Une autre approche beaucoup plus rapide consiste à obtenir le début de la chaîne et à l'utiliser dans un commutateur. Le commutateur configure une table de hachage avec les chaînes. C'est donc plus rapide que de comparer toutes les chaînes:
int index = theString.IndexOf(':');
if (index != -1) {
switch (theString.Substring(0, index)) {
case "mailto":
case "ftp":
case "joe":
// do something
break;
}
}
Je recommande vraiment d'utiliser la méthode String.StartsWith sur Regex.IsMatch si vous ne prévoyez que de vérifier le début d'une chaîne.
Dans votre cas, vous ne devez utiliser des expressions régulières que si vous envisagez de mettre en œuvre une comparaison de chaîne plus complexe à l'avenir.
Pour les fans de la méthode d'extension:
public static bool RegexStartsWith(this string str, params string[] patterns)
{
return patterns.Any(pattern =>
Regex.Match(str, "^("+pattern+")").Success);
}
Usage
var answer = str.RegexStartsWith("mailto","ftp","joe");
//or
var answer2 = str.RegexStartsWith("mailto|ftp|joe");
//or
bool startsWithWhiteSpace = " does this start with space or tab?".RegexStartsWith(@"\s");