Pytanie w sprawie regex, string – Czy są przypadki, w których manipulacja tekstem macierzystym jest bardziej pożądana niż regex?

2

Czy są przypadki, w których manipulacja tekstem macierzystym jest bardziej pożądana niż regex? W szczególności .net?

Uwaga: Regex wydaje się być wysoce emocjonalnym tematem, więc uważam, aby zadać takie pytanie.To pytanie nie zaprasza do osobistych / zawodowych opinii o regex, tylko konkretne sytuacje, w których rozwiązanie, w tym jego użycie, nie jest tak dobre, jak rodzime polecenia języka (w tym te, które mają kod bazowy wykorzystujący wyrażenie regularne) i dlaczego.

Należy również zauważyć, że Pożądane może oznaczać wydajność, może oznaczać czytelność kodu; to nie znaczypanaceum, ponieważ każde rozwiązanie problemu ma swoje zalety i ograniczenia.

Przepraszam, jeśli jest to duplikat, szukałem SO dla podobnego pytania.

Twoja odpowiedź

8   odpowiedzi
2

Użycie regexu oznacza w zasadzie osadzenie w środku programu małego programu napisanego w innym języku programowania. Zignoruję nieefektywność użycia wyrażenia regularnego w stosunku do rodzimej manipulacji ciągiem, ponieważ prawdopodobnie w większości przypadków nie ma to znaczenia.

Wolę natywną manipulację tekstem nad wyrażeniem regularnym za każdym razem, gdy manipulacja tekstem macierzystym będzie łatwiejsza do śledzenia dla innych osób. Co jest prawdą dość często, ponieważ wielu ludzi wokół mnie nie jest dobrze zaznajomionych z regex. Chyba że pracujesz z czymś, co dotyczy parsowania (przez regex), nie powinno być!

Wyrażenia regularne są zwykle wolniejsze, mniej czytelne i trudniejsze do debugowania niż natywne manipulowanie łańcuchami.

Głównym przypadkiem, w którym wolę wyrażenie regularne od manipulacji ciągami, jest to, że chcę mieć różne sposoby analizowania ciągów zależnie od źródła, a typy źródeł będą się zwiększać z czasem. Natywna manipulacja ciągiem nie jest w tym przypadku praktyczna. Miałem przypadki, w których przykleiłem kolumnę wyrażeń regularnych do bazy danych ...

4

Kiedy możesz to zrobićpo prostu z natywną manipulacją tekstem, zwykle lepiej (łatwiej czytać i lepszą wydajność) nie używać wyrażenia regularnego.

Osobista zasada: jeśli robienie tego „ręcznie” jest trudne lub względnie dłuższe, a przyrost wydajności jest znikomy, nie. Jeszcze tak.

Nie przykładaj:

rozdzielaćproste znajdowanie i zastępowaniedługi tekstpętlaistniejące funkcje natywne (np. w PHP,strrchr, ucwords...)
1

RegEx są bardzo elastyczne i potężne, ponieważ są pod wieloma względami podobne do instrukcji eval (). W związku z tym, w zależności od implementacji, mogą być nieco powolne. Zwykle nie stanowi to problemu, jeśli można ich uniknąć w szczególnie kosztownej pętli, która może zwiększyć wydajność.

Mając to na uwadze, mam tendencję do ich używania i martwię się tylko o wydajność, gdy aplikacja jest „zrobiona”, a ja mam prawdziwe testy porównawcze, aby udowodnić, że muszę poprawić wydajność. tj. unikać przedwczesnej optymalizacji.

0

Zwykle używam tylko manipulacji tekstem do prostego zastępowania ciągów (np. Zastępowanie tokenów w szablonie wartościami rzeczywistymi). Z pewnością można to zrobić z Regex, ale wymiana jest znacznie łatwiejsza.

1

Ilekroć ten sam wynik można osiągnąć przy rozsądnej ilości kodu.

Wyrażenia regularne są bardzo potężne, ale trudno je odczytać. Jeśli możesz zrobić to samo z prostymi operacjami na łańcuchach, co zazwyczaj oznacza, że ​​kod staje się łatwiejszy w zarządzaniu i utrzymaniu.

Istnieje pewne obciążenie związane z konfigurowaniem obiektu i analizowaniem wyrażenia. Dla prostszej manipulacji łańcuchami można uzyskać lepszą wydajność za pomocą prostych metod łańcuchowych.

Przykład:
Pobieranie nazwy pliku ze ścieżki pliku (tak, wiem, że do tego powinna być użyta klasa Path, to tylko przykład ...)

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

vs.

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

Drugie rozwiązanie jest proste i wymaga minimalnej pracy, aby uzyskać wynik. Rozwiązanie wyrażenia regularnego daje ten sam wynik, ale wykonuje więcej pracy, aby przeanalizować łańcuch, i tworzy wiązkę obiektów, które nie są potrzebne do wyniku.

6

Preferuję manipulowanie tekstem nad wyrażeniami regularnymi, aby analizować rozdzielone ciągi znaków. O wiele prostsze (przynajmniej dla mnie) jest dzielenie ciągu znaków niż zarządzanie wyrażeniem regularnym.

Biorąc pod uwagę jakiś tekst:

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

Możesz łatwo przeanalizować linię:

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

Jestem pewien, że istnieje lepszy sposób, ale z wyrażeniami regularnymi trzeba zrobić coś takiego:

<code>var match = Regex.Match(myString, "^([^,]*),([^,]*),([^,]*)$");
var value1 = match.Group[1];
...
</code>
+1. Również ustalone rekordy długości pola John Pirie
Należy zauważyć, że funkcje „split” często dzielą się na wyrażenie regularne. Svante
1

Parsowanie i wykonywanie Regex odnosi się do języka h, ost do odroczenia przetwarzania do jego „silnika” wyrażenia regularnego. Dodaje to narzut, więc dla każdej instancji, w której można użyć rodzimej manipulacji ciągiem, lepiej jest dla szybkości (i czytelności!).

0

Tak. Przykład:

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

Powiązane pytania