Frage an regex, string – Gibt es bestimmte Fälle, in denen native Textmanipulationen wünschenswerter sind als reguläre Ausdrücke?

2

Gibt es bestimmte Fälle, in denen native Textmanipulationen wünschenswerter sind als reguläre Ausdrücke? Insbesondere .net?

Hinweis: Regex scheint ein sehr emotionales Thema zu sein, daher bin ich vorsichtig, eine solche Frage zu stellen.Diese Frage lädt nicht zu persönlichen / beruflichen Meinungen zu regex einNur in bestimmten Situationen, in denen eine Lösung einschließlich ihrer Verwendung nicht so gut ist wie sprachgebundene Befehle (einschließlich solcher, denen unter Verwendung von Regex Code zugrunde liegt) und warum.

Beachten Sie auch, dass Wünschenswert Leistung und Codelesbarkeit bedeuten kann. es bedeutet nichtAllheilmittel, da jede Lösung für ein Problem ihre Vor- und Nachteile hat.

Entschuldigung, wenn dies ein Duplikat ist, habe ich SO nach einer ähnlichen Frage gesucht.

Deine Antwort

8   die antwort
1

da sie in vielerlei Hinsicht einer eval () - Anweisung ähneln. Allerdings können sie je nach Implementierung etwas langsam sein. Normalerweise ist dies jedoch kein Problem, wenn sie in einer besonders kostspieligen Schleife vermieden werden können, wodurch die Leistung gesteigert werden kann.

Davon abgesehen benutze ich sie in der Regel und mache mir nur dann Sorgen um die Leistung, wenn die App "fertig" ist und ich echte Benchmarks habe, die beweisen, dass ich die Leistung optimieren muss. vermeiden Sie vorzeitige Optimierung.

2

müssen Sie ein winziges Programm, das in einer anderen Programmiersprache geschrieben ist, in die Mitte Ihres Programms einbetten. Ich werde die Ineffizienz der Verwendung eines Regex gegenüber der Manipulation nativer Zeichenfolgen ignorieren, da dies in den meisten Fällen wahrscheinlich nicht relevant ist.

Ich bevorzuge die native Textmanipulation gegenüber Regex, wenn die native Textmanipulation für andere Personen einfacher zu befolgen ist. Dies trifft häufig zu, da viele meiner Mitmenschen mit Regex nicht sehr vertraut sind. Wenn sie nicht mit etwas arbeiten, bei dem es sehr um das Parsen geht (über Regex), sollten sie es nicht müssen!

Reguläre Ausdrücke sind normalerweise langsamer, weniger lesbar und schwerer zu debuggen als die native Manipulation von Zeichenfolgen.

Der Hauptfall, in dem ich Regex der Manipulation von Strings vorziehen werde, ist, wenn ich in der Lage sein möchte, Strings abhängig von der Quelle auf unterschiedliche Weise zu analysieren, und die Arten von Quellen mit der Zeit zunehmen. Eine native String-Manipulation ist in diesem Fall nicht wirklich praktisch. Ich hatte Fälle, in denen ich eine Regex-Spalte in eine Datenbank gesteckt habe ...

6

Ich bevorzuge die Textbearbeitung gegenüber regulären Ausdrücken, um die Eingabe von Zeichenfolgen mit Trennzeichen zu analysieren. Es ist weitaus einfacher (zumindest für mich), einen String-Split auszugeben, als einen regulären Ausdruck zu verwalten.

Vorgegebener Text:

<code>value1, value2, value3
</code>

Sie können die Zeile einfach analysieren:

<code>var values = myString.Split(',');
</code>

Ich bin mir sicher, dass es einen besseren Weg gibt, aber mit regulären Ausdrücken müssten Sie etwas tun wie:

<code>var match = Regex.Match(myString, "^([^,]*),([^,]*),([^,]*)$");
var value1 = match.Group[1];
...
</code>
Es sollte beachtet werden, dass "geteilte" Funktionen häufig auf einem regulären Ausdruck aufgeteilt werden. Svante
+1. Auch Datensätze mit fester Feldlänge John Pirie
0

Normalerweise benutze ich nur die Textbearbeitung, um Zeichenfolgen einfach zu ersetzen (z. B. um Token in einer Vorlage durch tatsächliche Werte zu ersetzen). Sie könnten dies sicherlich mit Regex tun, aber der Austausch ist viel einfacher.

1

ost darauf, die Verarbeitung auf ihre reguläre "Engine" zu verschieben. Dies erhöht den Overhead. Daher ist es aus Gründen der Geschwindigkeit (und Lesbarkeit!) Vorzuziehen, wenn native Zeichenfolgenmanipulationen verwendet werden können.

4

einfach Bei der Bearbeitung von nativem Text ist es normalerweise vorzuziehen (einfacher zu lesen und bessere Leistung), Regex nicht zu verwenden.

Persönliche Faustregel: Wenn es schwierig oder relativ langwierig ist, es "manuell" zu tun, und dieser Leistungszuwachs vernachlässigbar ist, tun Sie es nicht. Sonst tun.

Keine Beispiele:

Teilteinfach finden & ersetzenlanger TextSchleifevorhandene native Funktionen (wie in PHP,strrchr, ucwords...)
1

rreicht werden kann.

Reguläre Ausdrücke sind sehr mächtig, aber sie sind in der Regel schwer zu lesen. Wenn Sie dasselbe mit einfachen Zeichenfolgenoperationen tun können, bedeutet dies normalerweise, dass der Code einfacher zu verwalten und zu warten ist.

Das Einrichten des Objekts und das Parsen des Ausdrucks sind mit einem gewissen Aufwand verbunden. Für eine einfachere Manipulation von Zeichenfolgen können Sie mit einfachen Zeichenfolgenmethoden eine bessere Leistung erzielen.

Beispiel:
Abrufen des Dateinamens von einem Dateipfad (ja, ich weiß, dass die Path-Klasse dafür verwendet werden sollte, es ist nur ein Beispiel ...)

<code>string name = Regex.Match(path, @"([^\\]+)$").Groups[0].Value;
</code>

gegen

<code>string name = path.Substring(path.LastIndexOf('\\') + 1);
</code>

Die zweite Lösung ist unkompliziert und erledigt den minimalen Arbeitsaufwand, um das Ergebnis zu erzielen. Die Lösung für reguläre Ausdrücke führt zu demselben Ergebnis, benötigt jedoch mehr Arbeit zum Parsen der Zeichenfolge und erzeugt eine Reihe von Objekten, die für das Ergebnis nicht benötigt werden.

0

Ja. Beispiel:

<code>char* basename (const char* path)
{
  char* p = strrchr(path, '/');
  return (p != NULL) ? (p+1) : path;
}
</code>

Verwandte Fragen