Regex zu finden, der erste Großbuchstabe vorkommen in einem string
Möchte ich finden, der index der erste Großbuchstabe vorkommen in einem string.
E. g. -
String x = "soHaM";
Index zurückgeben sollte 2 für diese Zeichenfolge. Die regex sollte ignorieren alle anderen Großbuchstaben nach dem ersten zu finden ist. Wenn es keine Großbuchstaben gefunden, dann sollte es wieder 0. Bitte helfen Sie.
- Warum bist du mit Regex?
- In der Tat! Warum nicht einfach eine Schleife verwenden?
- Warum NICHT mit einer regex?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir ziemlich sicher, dass alles, was Sie brauchen, ist die regex
A-Z
\p{Lu}
:Hast du das probiert?
\p{Z}
würde mit Leerzeichen und Zeilen - /Absatz-Separatoren und die\p{P}
würde mit Satzzeichen. OP wollte nur Großbuchstaben.new Regex("\\p{Lu}")
, nicht[A-Z]
.Char.IsUpper
(oder einer seiner moralischen äquivalente). Kann es nicht vielleicht sein, schneller als die Schleife, und wäre wahrscheinlich zumindest ein wenig langsamer. Am besten ist es möglicherweise einfacher und schneller zu schreiben, oder besser lesbar, oder mehr wartbar. (Obwohl mit etwas diese einfache, möglicherweise keines der oben genannten.)Nur so zum Spaß, eine LINQ Lösung:
Zurück
IEnumerable<Int32>
. Wenn Sie möchten, dass der index des ersten Großbuchstabens, rufen Sie einfachindex.First()
oder abrufen, nur die erste Instanz in der LINQ:BEARBEITEN
Als Vorschlag in die Kommentare, hier ist eine weitere LINQ-Methode (evtl. mehr Leistung bietet, als meinen ursprünglichen Vorschlag):
x.Select((c, index) => new { Char = c, Index = index }).First(c => Char.IsUpper(c.Char)).Index;
.First()
wird eine exception werfen wenn es keine Großbuchstaben. Dies kann behandelt werden, oder Sie können stattdessen.FirstOrDefault
, die Rückkehr0
wenn es keine Großbuchstaben. Wenn Sie mit dieser LINQ-Abfrage zu kürzen, nicht Großbuchstaben, aus dem Anfang des Strings, dann mit.FirstOrDefault()
mit der Abfrage das ganze Zeichenfolge unberührt, wenn es keine Großbuchstaben (im Fall vonx.Substring(index)
).Keine Notwendigkeit für
Regex
:http://msdn.microsoft.com/en-us/library/system.char.isupper.aspx
Der Vollständigkeit halber, hier meine LINQ-Ansatz(es ist zwar nicht das richtige Werkzeug hier, selbst wenn OP verwenden könnte):
Erstmal deine Logik nicht, wenn die Methode gibt 0 zurück, in Ihrem Fall würde es bedeuten, der erste char in diese Liste war in Großbuchstaben geschrieben, so würde ich empfehlen, dass -1 heißt nicht gefunden, oder werfen eine Ausnahme.
Eh nur reguläre Ausdrücke verwenden, denn Sie können ist nicht immer die beste Wahl, plus Sie sind ziemlich langsam und schwer zu Lesen in der Allgemeinen, so dass yoru code viel schwieriger, mit zu arbeiten.
Egal, hier ist mein Beitrag
Mithilfe Von Linq:
Verwendung Von C#:
.Select(c => c)
Teil mir das bitteLoop
i ist der Wert von u betrachten sollten;