web-dev-qa-db-fra.com

Motif de regex pour vérifier si une chaîne commence par une certaine sous-chaîne?

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?

30
kacalapy

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.

56
Mark Byers

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.

17
Oded

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 |.

modifier:

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

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.

  • Premièrement, l'expression régulière en C # Est un langage dans un langage avec do Ne facilite pas la compréhension et la maintenance du code L’expression régulière est un type De DSL .
  • Deuxièmement, beaucoup de développeurs ne comprennent pas les expressions rationnelles: c’est quelque chose qui est incompréhensible pour plusieurs humains.
  • Troisièmement, la méthode StartsWith apporte les fonctionnalités permettant à la comparaison dépendante de la culture dont les expressions régulières ne sont pas conscientes.

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. 

1
Ucodia

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");
0
K. R.