2016-06-06 4 views
1

Ich versuche derzeit, eine Zeichenfolge mit Daten zu entfernen, die das Bindestrichsymbol enthalten kann.So entfernen Sie eine Zeichenfolge von dem Punkt, an dem ein Bindestrich in der Zeichenfolge gefunden wird C#

string Details = "hsh4a - 8989"; 
    var regexItem = new Regex("^[^-]*-?[^-]*$"); 
    string stringin; 
    stringin = Details.ToString(); 

    if (regexItem.IsMatch(stringin)) { 
    stringin = stringin.Substring(0, stringin.IndexOf("-") - 1); //Strip from the ending chars and - once - is hit. 
    } 
    Details = stringin; 
    Console.WriteLine(Details); 

Aber zieht in einen Fehler, wenn die Zeichenfolge jede der Bindestrich nicht enthält:

E.g. Basic logic: 

string stringin = "test - 9894"; OR Data could be == "test"; 
if (string contains a hyphen "-"){ 
Strip stringin; 
output would be "test" deleting from the hyphen. 
} 
Console.WriteLine(stringin); 

Die aktuelle C# -Code ich zur Arbeit zu kommen bin versucht, wird unten gezeigt.

+0

Sie brauchen keine Zeichenfolge tun müssen details.tostring .. seine bereits. Wenn Sie tun werden "stringin = stringin.Substring (0, stringin.IndexOf (" - ") - 1);" warum stören Sie sich mit Regex, überprüfen Sie einfach "-" existiert. – BugFinder

+0

Ich benutze zur Zeit toString(), weil dies ein Code-Beispiel ist, in meinem vollständigen Code zieht es Daten aus einer XML API mit Objekten/verschiedenen Datensätzen in einer Schleife. – Mattlinux1

Antwort

2

Ihre regex bittet um „Null oder eine Wiederholung von -“, was bedeutet, dass es passt, auch wenn Sie Ihre Eingabe einen Bindestrich nicht enthalten. Danach tun Sie dies

Die gibt einen Index außerhalb des Bereichs Ausnahme (Es gibt keinen Bindestrich zu finden).

Machen Sie eine einfache Änderung Ihrer regex und es funktioniert mit oder ohne - fragen Sie nach „ein oder mehrere Bindestriche“:

var regexItem = new Regex("^[^-]*-+[^-]*$"); 
    here -------------------------^ 
+1

Interessante downvote hier, ID interessiert sein zu wissen, was jemand denkt, ist falsch, wenn ich [versuchte diese Lösung vor dem Posten] (http://rextester.com/SBNLHD79077) – Jamiec

+0

Es hat gut funktioniert. – Mattlinux1

+1

@ Mattlinux1 - Ich weiß :) – Jamiec

3

Wie wäre es damit?

stringin.Split('-')[0].Trim(); 

Sie könnten sogar die maximale Anzahl von Teil angeben überlastet mit Split Konstruktor.

stringin.Split('-', 1)[0].Trim(); 
1

Es scheint, dass Sie die (Teil-) Zeichenkette ab dem Strich ('-' wollen) wenn das Original '-' oder die ursprüngliche Zeichenkette enthält, falls kein Bindestrich vorhanden ist. Wenn es Ihr Fall ist:

String Details = "hsh4a - 8989"; 
    Details = Details.Substring(Details.IndexOf('-') + 1); 
+1

Das wird immer noch die falsche Antwort geben, wenn kein Bindestrich existiert, nicht? – Jamiec

+1

@Jamiec: wenn 'Details' nicht enthält '' -'' dann' Details.IndexOf ('-') 'gibt' -1' zurück und 'Teilstring (0)' gibt den gesamten 'Details' String zurück –

+1

Natürlich es tut, mein Schlechter! – Jamiec

1

ich nicht regex für diesen Fall verwenden würden, wenn ich du wäre, es macht die Lösung sehr viel komplexer als es sein kann. Bei String Ich bin sicher, wird nicht mehr als ein paar Striche habe ich diesen Code verwenden würde, weil es eine Auskleidung und ist sehr einfach:

string str= entryString.Split(new [] {'-'}, StringSplitOptions.RemoveEmptyEntries)[0]; 

Wenn Sie wissen, dass ein String hohe Menge an Striche enthalten könnte, Es ist nicht empfehlenswert, diesen Ansatz zu verwenden - es wird eine große Menge verschiedener Strings erzeugen, obwohl Sie nur nach dem ersten suchen. Also würde die Lösung so etwas wie diesen Code aussehen:

int firstDashIndex = entryString.IndexOf("-"); 
string str = firstDashIndex > -1? entryString.Substring(0, firstDashIndex) : entryString; 
1

Sie brauchen keine Regex dafür. Eine einfache IndexOf-Funktion gibt Ihnen den Index des Bindestrichs, dann können Sie es von dort aufräumen.

Dies ist auch ein großartiger Ort, um mit dem Schreiben von Unit-Tests zu beginnen. Sie sind sehr gut für solche Sachen.

Hier ist, was der Code aussehen könnte:

string inputString = "ho-something"; 
string outPutString = inputString; 

      var hyphenIndex = inputString.IndexOf('-'); 
      if (hyphenIndex > -1) 
      { 
       outPutString = inputString.Substring(0, hyphenIndex); 
      } 

      return outPutString; 
Verwandte Themen