2016-10-24 4 views
0

Ich versuche zu verstehen, warum, wenn ich meinen Textdokument Inhalt (aktualisierte Inhalt, jedes Mal ist es neue Zeichenfolge) mit neuen Einfügung für ähnliche bereits vorhandene Zeichenfolge, zum Beispiel wenn Dokumentinhalt ist:Wie finde ich String mit Interpunktion am Ende

hello world 
hello, world 
hello, world. 
.hello, world 

es neu hinzugefügt String gründet, wenn es bereits in Inhalt der Datei vorhanden ist, wenn es „Hallo Welt“ oder „hallo, Welt“ ist, mit einfachen Prüfzustand, die benachrichtigt mich, wenn die Zeichenfolge bereits existiert (und es gibt keine Einschränkungen oder andere Bedingungen für das letzte Symbol in der Zeichenfolge):

List<string> wordsTyped = new List<string>(); 

    if (wordsTyped.Contains(newStr)) 
    { 
     string[] allLines = File.ReadAllLines(path); 
    } 

aber es benachrichtigt mich nicht, wenn ich in meinem Dokument Inhaltszeichenfolge mit Interpunktionszeichen am Ende oder am Anfang der Zeichenfolge habe. Zum Beispiel, wenn "Hallo, Welt." die bereits existiert, und neue einfügen ist ähnlich "Hallo, Welt." oder ", Hallo, Welt" es findet es nicht und benachrichtigt mich als nicht vorhanden.

Wenn es keine Lösung gibt, um mit diesem Problem herauszufinden, und ich bin gezwungen, letzte spezielle Symbol in der Zeichenfolge zu entfernen, in diesem Fall wäre es auch gut zu wissen, wie es mit Regex für bestimmte Symbole Punkt, Komma zu tun , Hash und Apostroph und behalten Sie alles andere natürlich

+0

Bitte zu erarbeiten und zu bearbeiten, ist die Frage unklar – Jim

+0

@ Jim in diesem Punkt unklar ist? Ich finde keine Zeichenfolge im Textdokument, wenn am Ende der Zeichenfolge ein Satzzeichen steht. Ich kann finden ** h, el! L: o ** aber kann es nicht finden, wenn es ist, h, el! L: o. ** oder ** h, el! L: o; ** egal oder **, h, el! l: o ** oder wenn ich es am Anfang der Zeichenfolge habe –

+0

Wenn Sie nur Sonderzeichen vor und nach Ihrer Eingabe-Zeichenfolge interessieren, können Sie einfach eine For-Schleife verwenden, um über Ihre zu iterieren Array und verwenden Sie die contains-Methode von String, um zu überprüfen, ob "Hallo Welt". enthält "Hallo Welt". Falls Sie zwischen diesen Wörtern Sonderzeichen haben, [[werfen Sie einen Blick auf diesen Thread] (http://stackoverflow.com/questions/6555182/remove-all-special-characters-except-space-from-a-string-use) -javascript), um eine grobe Vorstellung von der Regex zu bekommen. Ich würde auch empfehlen, eine Seite wie regex101.com zu verwenden, um Ihre regex idiotensicher zu erstellen :) – Seth

Antwort

1

Sie könnten ein HashSet verwenden, um die Zeichenfolge zu speichern, die Sie bereits haben, da der Zugriff viel schneller ist. Dann entfernen Sie alle Zeichen, die Sie nicht in der Zeichenfolge wollen:

static String beautify(String ugly) 
{ 
    return String.Join("", ugly.Where(c => Char.IsLetter(c))); 
} 

Hier habe ich die Freiheit, nur zu prüfen, ob das Zeichen ein Buchstabe ist, können Sie sich natürlich anpassen Ihre Bedürfnisse fühlen. Dann nutzen Sie dieses kleine Programm:

static HashSet<String> lines = new HashSet<String>(); 
static List<String> input = new List<String>() 
{ 
    "hello world","hello, world","hello, world.",".hello, world", 
}; 

static void Main(String[] args) 
{ 
    initList(input); 
    var tests = new List<String>() { 
     "h,e.l!l:o. w----orl.d.",// True 
     "h,e.l!l:o. w----ol.d.",// False 

    }; 

    foreach(var test in tests) 
    { 
     Console.WriteLine($"The string \"{test}\" is {(lines.Contains(beautify(test)) ? "already" : "not")} here"); 
    } 

    Console.ReadLine(); 
} 

static void initList(List<String> input) 
{ 
    foreach(String s in input) 
     lines.Add(beautify(s)); 
} 

static String beautify(String ugly) 
{ 
    return String.Join("", ugly.Where(c => Char.IsLetter(c))); 
} 

Welche folgende Ausgabe:

Der String "! H, e.l l. O. W ---- orl.d" ist bereits hier

Die Zeichenfolge "h, e.l! l: o. w ---- ol.d." ist hier nicht


Sie ein HashSet wie so verwenden können:

lines 
Count = 4 
    [0]: "hello world" 
    [1]: "hello, world" 
    [2]: "hello, world." 
    [3]: ".hello, world" 
lines.Contains("hello, world.") 
true 
lines.Contains("hello, world..") 
false 
+0

Hallo, sehr nützlich, aber nicht in meinem Fall. Ich kann nicht jeden neuen Insert oder aktualisierten Inhalt in HashSet vorhersagen und finde Zeichenkette mit dem Entfernen zusätzlicher Interpunktionszeichen und Vergleiche mit dem festen HashSet-Inhalt.Ich möchte keine Interpunktion aus der Zeichenkette entfernen, ich möchte sie genau so finden, wie sie gespeichert wurde und darüber Bescheid wissen, wenn die neue Einfügung gleich der vorhandenen Zeichenkette ist. Wenn ich schon String ** ok habe. ** mit Punkt am Ende und mein neuer Insert ist gleich ** ok. ** Ich will es finden. Es funktioniert mit ** ok ** und ** ok ** bis das Interpunktionszeichen nicht am Ende oder Anfang eines Strings steht **. Ok ** und ** ok. ** –

+0

@mickbt dann juste das Hashset ohne die Funktion verschönern –

+0

ja, aber wie ich sein soll, wenn ich es mit jedem neuen String Benutzer in Datei einfügen und dann angefordert, wenn ich Strings in HashSet verschreiben, um diese Lösung verwenden möchten? Vielleicht habe ich diese Lösung nicht richtig verstanden? –

Verwandte Themen