Benutzer mit den meisten Antworten
Textsuche mit ß oder ss

Frage
-
Hallo,
ich bin gerade auf ein Problem gestoßen. Ich möchte in einem Text nach Vorkommen von Text suchen und diese markieren. Dabei habe ich festgestellt, daß ss und ß als gleich angesehen werden, sofern man beim IndexOf() nicht explizit StringComparison.Ordinal angibt.
Möchte ich aber den Standardvergleich (mit StringComparison.CurrentCulture) beibehalten, werden die Stellen, wo ich nach ss suche, aber ß finde, das ß und der nachfolgende Buchstabe markiert. Suche ich nach ß und finde ss, wird nur das erste s markiert. Die Markierung nehme ich selbst vor. Aber ich kenne ja nur die Länge des zu suchenden Textes, nicht die des gefundenen.
Etwas gemeiner wird es, wenn ich nach ss suche und ein ß finde, das sich am Ende des Textes befindet, denn dann löst ein Substring auf den gefundenen Text in der Länge des gesuchten Textes eine ArgumentOutOfRangeException aus.
Gibt es eine Möglichkeit herauszufinden, wie lang der gefundene Textteil wirklich ist, ohne ein IndexOf() selbst implementieren zu müssen? Das könnte nämlich kompliziert werden, zumal ich gar nicht weiß, welche Zeichen oder Zeichenkombinationen in den verschiedenen Sprachen als gleich angesehen werden. Im Deutschen scheint es jedoch nur ss und ß zu betreffen, nicht z.B. ö und oe.
Gruß
Heiko
Antworten
-
Hallo Stefan,
ich habe gerade Regex.Matches() ausprobiert. Die gibt mir zwar die Längen der gefundenen Stellen zurück, aber im Gegensatz zu StringComparison für IndexOf() kennen die RegexOptions nur CultureInvariant. Unabhängig davon, ob mit oder ohne RegexOptions.CultureInvariant, wird zu gesuchtem ß nie ss gefunden oder umgekehrt.
Damit liefert Matches() mit RegexOptions.CultureInvariant ein anderes Ergebnis als IndexOf() mit StringComparison.InvariantCulture.
Da ich nur nach einem beliebigen, vom Benutzer eingegebenen String suchen möchte, will ich den nicht noch zusätzlich parsen und ein Pattern daraus basteln, damit bei ß auch ss (oder umgekehrt) gefunden wird. Mit anderen Sprachen soll es außerdem funktionieren.
Gruß
Heiko- Als Antwort vorgeschlagen Aleksander Chalabashiev Freitag, 25. September 2015 08:38
- Als Antwort markiert Aleksander Chalabashiev Donnerstag, 1. Oktober 2015 06:21
Alle Antworten
-
Hallo,
ich verstehe dein Problem teilweise.
Aber angenommen ich habe den String: "ABC SS ß".
IndexOf wird dir den Index der ersten 's' und des 'ß' geben.
Du kannst aber einfach genau diesen Buchstaben auslesen und davon abhängig entscheiden.
Such dir das Zeichen aus dem String ( 's' == myString[index] ) und prüfe, ob es 's' ist oder 'ß'. Wenn es ersteres ist, weißt du, dass der gefundene Text 2 Zeichen lang ist, andernfalls nur ein Zeichen lang.
Das sollte dir helfen. Zumindest wenn ich deine Frage richtig verstanden habe.
© 2015 Thomas Roskop
Germany // Deutschland -
Hallo Thomas,
danke für deinen Vorschlag. Der Benutzer soll nach beliebigen Zeichenketten suchen können, z.B. nach "Quasselstraße". Dann würde das schon komplexer. Eigentlich geht es mir auch mehr um das Prinzip. Bei anderen Sprachen kann ich nicht wissen, welche Zeichen und Kombinationen als gleich angesehen werden. Offenbar scheint es da nichts Passendes zu geben. Man bräuchte noch so etwas wie
IndexOf(string searchString, int startIndex, StringComparison compType, out int lengthOfFoundString);
Sowas kann man nicht selbst programmieren, wenn es für alle Sprachen benutzbar sein soll.
Gruß
Heiko -
Hallo Heiko,
ggfs. ist Regex.Replace eher für deine Zwecke geeignet.
https://msdn.microsoft.com/de-de/library/xwewhkd1.aspx
Über die Muster kannst Du die Ersetzung auf den gefundenen Wert vornehmen (deine Hervorhebung ist ja letztendlich auch nichts anderes als eine spezielle Formatierung).
https://msdn.microsoft.com/de-de/library/ewy2t5e0.aspx
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo Stefan,
ich habe gerade Regex.Matches() ausprobiert. Die gibt mir zwar die Längen der gefundenen Stellen zurück, aber im Gegensatz zu StringComparison für IndexOf() kennen die RegexOptions nur CultureInvariant. Unabhängig davon, ob mit oder ohne RegexOptions.CultureInvariant, wird zu gesuchtem ß nie ss gefunden oder umgekehrt.
Damit liefert Matches() mit RegexOptions.CultureInvariant ein anderes Ergebnis als IndexOf() mit StringComparison.InvariantCulture.
Da ich nur nach einem beliebigen, vom Benutzer eingegebenen String suchen möchte, will ich den nicht noch zusätzlich parsen und ein Pattern daraus basteln, damit bei ß auch ss (oder umgekehrt) gefunden wird. Mit anderen Sprachen soll es außerdem funktionieren.
Gruß
Heiko- Als Antwort vorgeschlagen Aleksander Chalabashiev Freitag, 25. September 2015 08:38
- Als Antwort markiert Aleksander Chalabashiev Donnerstag, 1. Oktober 2015 06:21