Wie finde ich den Index einer Teilzeichenkette?

8

Suche nach Elixir-Äquivalent von Ruby:

%Vor%     
qertoip 22.02.2016, 10:20
quelle

5 Antworten

10

TL; DR: String.index / 2 fehlt absichtlich, weil smartere Alternativen existieren . Sehr oft löst String.split / 2 das zugrundeliegende Problem - und mit einer besseren Performance.

  • Ich nehme an, wir sprechen hier über UTF-8-Strings und erwarten, dass wir sauber mit Nicht-ASCII-Zeichen umgehen.

  • Elixir fördert schnellen Code. Es stellt sich heraus, dass Probleme, die wir normalerweise mit String.index / 2 lösen, viel klüger gelöst werden können und die Leistung erheblich verbessert wird, ohne die Lesbarkeit des Codes zu beeinträchtigen.

  • Die intelligentere Lösung besteht darin, String.split / 2 und / oder ähnliche String-Modulfunktionen zu verwenden. String.split / 2 arbeitet auf Byte-Ebene, während Grapheme immer noch korrekt gehandhabt werden. Es kann nicht schief gehen, weil beide Argumente Strings sind! Der String.index / 2 müsste auf einer Graphemebene arbeiten und im gesamten String langsam suchen.

  • Aus diesem Grund ist es unwahrscheinlich, dass String.index / 2 zur Sprache hinzugefügt wird, es sei denn, es werden sehr überzeugende Anwendungsfälle gefunden, die von vorhandenen Funktionen nicht sauber gelöst werden können.

  • Siehe auch die elixir-lang-core-Diskussion dazu: Ссылка

  • Übrigens ist Elixir in seiner ausgereiften Unicode-Unterstützung ziemlich einzigartig. Während die meisten Sprachen auf Codepoint-Ebene arbeiten (umgangssprachlich "Zeichen"), arbeitet Elixir mit einem höheren Konzept von Graphemen. Grapheme sind das, was Benutzer als eine Figur wahrnehmen (nehmen wir an, es ist ein praktischeres Verständnis eines "Charakters"). Grapheme können mehr als einen Codepoint enthalten (der wiederum mehr als ein Byte enthalten kann).

Schließlich, wenn wir wirklich den Index brauchen:

%Vor%     
qertoip 23.02.2016, 20:53
quelle
10

Ich glaube nicht, dass es dafür einen Elixir-Wrapper gibt, siehe # 1119 .

>

Sie können :binary.match direkt bis dahin aufrufen:

%Vor%

Der Rückgabewert ist ein Tupel, das den Index und die Länge der Übereinstimmung enthält. Sie können nur den Index extrahieren, indem Sie in |> elem(0) einpassen oder die Mustererkennung verwenden.

Beachten Sie, dass :binary.match :nomatch zurückgibt, wenn die Teilzeichenfolge nicht in der Zeichenfolge gefunden wird.

    
Dogbert 22.02.2016 10:26
quelle
5

Sie können Regex.run/3 verwenden und als eine Option return: :index übergeben:

%Vor%     
Paweł Obrok 22.02.2016 16:55
quelle
4

Sie können den Byte-Index mit : binary.match / 3

ermitteln %Vor%

Wenn Sie die Position in der Zeichenfolge möchten, verwenden Sie:

%Vor%

Die String Modul-Dokumentation erklärt den Unterschied zwischen Byte-Länge und String-Länge.

    
Gazler 22.02.2016 10:26
quelle
0
%Vor%     
Jose.m.g 09.05.2017 17:47
quelle

Tags und Links