it-swarm.com.de

Regex-Muster zur Überprüfung, ob eine Zeichenfolge mit einer bestimmten Teilzeichenfolge beginnt?

Was ist der reguläre Ausdruck, der überprüft wird, ob eine Zeichenfolge mit "mailto" oder "ftp" oder "joe" oder ... beginnt?.

Jetzt verwende ich C # und Code wie folgt in einem großen if mit vielen ors:

String.StartsWith("mailto:")
String.StartsWith("ftp")

Es sieht so aus, als wäre ein Regex dafür besser. Oder fehlt mir hier ein C # -Weg?

30
kacalapy

Du könntest benutzen:

^(mailto|ftp|joe)

Aber um ehrlich zu sein, ist StartsWith hier vollkommen in Ordnung. Sie könnten es wie folgt umschreiben:

string[] prefixes = { "http", "mailto", "joe" };
string s = "joe:bloggs";
bool result = prefixes.Any(prefix => s.StartsWith(prefix));

Sie können auch die Klasse System.Uri betrachten, wenn Sie URIs analysieren.

56
Mark Byers

Folgendes wird auf jeden String passen, der mit mailto, ftp oder http beginnt:

 RegEx reg = new RegEx("^(mailto|ftp|http)");

Um es aufzubrechen: 

  • ^ stimmt mit dem Zeilenanfang überein
  • (mailto|ftp|http) stimmt mit einem der Elemente überein, die durch einen | getrennt sind.

Ich würde StartsWith in diesem Fall für lesbarer halten.

17
Oded

Die StartsWith-Methode ist schneller, da bei der Interpretation eines regulären Ausdrucks kein Aufwand anfällt, aber wie folgt:

if (Regex.IsMatch(theString, "^(mailto|ftp|joe):")) ...

Der ^ berechnet den Anfang der Zeichenfolge. Sie können beliebige Protokolle zwischen die Klammern setzen, die durch |-Zeichen getrennt sind.

bearbeiten:

Ein anderer Ansatz, der viel schneller ist, besteht darin, den Anfang der Zeichenfolge zu erhalten und in einem Switch zu verwenden. Der Switch richtet eine Hashtabelle mit den Zeichenfolgen ein, sodass er schneller ist als der Vergleich aller Zeichenfolgen:

int index = theString.IndexOf(':');
if (index != -1) {
  switch (theString.Substring(0, index)) {
    case "mailto":
    case "ftp":
    case "joe":
      // do something
      break;
  }
}
6
Guffa

Ich empfehle wirklich die Verwendung der String.StartsWith-Methode über Regex.IsMatch, wenn Sie nur den Anfang eines Strings überprüfen möchten.

  • Erstens ist der reguläre Ausdruck in C # Eine Sprache in einer Sprache mit do , Die nicht zum Verständnis und zur Codierung von Regulärer Ausdruck ist eine Art von DSL .
  • Zweitens verstehen viele Entwickler keine regulären Ausdrücke. Dies ist etwas, was für viele Menschen nicht verständlich ist.
  • Drittens bringt die StartsWith-Methode Ihnen Funktionen zur Verfügung, mit denen Sie einen Kultur-abhängigen Vergleich aktivieren können, den reguläre Ausdrücke nicht kennen.

In Ihrem Fall sollten Sie reguläre Ausdrücke nur verwenden, wenn Sie in Zukunft einen komplexeren Zeichenfolgenvergleich implementieren möchten. 

1
Ucodia

Für die Fans der Erweiterungsmethode:

public static bool RegexStartsWith(this string str, params string[] patterns)
{
    return patterns.Any(pattern => 
       Regex.Match(str, "^("+pattern+")").Success);
}

Verwendungszweck 

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.