C# Reguläre Audrücke ( String suchen und Zeile ausgeben

  • C#

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Pr0gger.

    C# Reguläre Audrücke ( String suchen und Zeile ausgeben

    Hallo zusammen, :)

    und zwar habe ich ein Formular erstellt. Dieses Formular hat eine richtextbox, in die ich einen txt- File einlese und und textbox in der später meine Suchergebnisse stehen sollen. In einer anderen textbox gebe ich den Suchbegriff ein und kann mit"Enter" bestätigen, sodass er mir diesen Begriff sucht.

    Quellcode

    1. private void textBox1_KeyDown(object sender, KeyEventArgs e)
    2. {
    3. Int32 StartIndex = 0;
    4. string text = textBox1.Text;
    5. if (e.KeyCode == Keys.Enter)
    6. {
    7. while (richTextBox1.Text.IndexOf(text, StartIndex) >= 0)
    8. {
    9. richTextBox1.SelectionStart = richTextBox1.Text.IndexOf(text, StartIndex);
    10. richTextBox1.SelectionLength = text.Length;
    11. richTextBox1.SelectionColor = Color.Red;
    12. StartIndex = richTextBox1.Text.IndexOf(text, StartIndex) + text.Length;
    13. richTextBox2.Text = text;
    14. }
    15. }



    Bis jetz sieht das so aus. Er markiert mir die Begriffe rot. Nun meine frage: Wie bekomme ich die Ergebnisse der Suche in meine textbox ? ( Komplette Zeile soll ausgegeben werden) , Wenn der begriff z.B 10 zeilen untendrunter nocheinmal vorkommt soll er die zeile auch mit in die textbox einfügen. Ich habe gehört man kann dies mit regulären Ausdrücken machen, doch ich bin Neuling und kenn mich noch nicht so gut aus.

    Ich programmiere mit microsoft visual studio 2010 und zwar C#. Das alles ist über eine windows-Forms-Applikation.
    Ich hoffe ihr könnt mir helfen,

    Vielen Dank im Vorraus :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Pr0gger“ ()

    Willkommen im Forum.

    Erst mal:
    Damit wir hier nicht Augenkrebs bekommen, solltest Du Codeschnipsel immer in Code-Tags einbetten.
    Bei C-Sprachen ist das [ C ] Code [ / C ] (Leerzeichen halt entfernen).
    Und für zukünftiges: Bitte VB Tags benutzen - was ist damit gemeint?

    So.

    Für RegEx gibt's hier ein Tutorial: [VB 2008] RegEx Tutorial - Blutige Anfänger und Fortgeschrittene

    Mit einer foreach-Schleife kannst Du dann alle Treffer der gesuchten Ausdrücke durchlaufen und die Index- und Length-Eigenschaften der Matches geben Dir genau das was Du brauchst, um sie zu markieren.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    C#-Quellcode

    1. String suchbegriff = "10";
    2. (from Match m in Regex.Matches(richTextBox1.Text, String.Format(@"(^|(?<=\.\s))(\w|\s|,)*{0}(\w|\s|{0}|,)*?\.",suchbegriff), RegexOptions.IgnoreCase) select m.Value).ToList().ForEach(delegate(String s) { richTextBox2.Text += " " + s; });

    Viel Spaß...
    @Rinecamo: Overkill? (und doch etwas unübersichtlich).

    Ich würde da eher noch vorschlagen, die Matches mit einer foreach-Schleife abzuarbeiten, weil es wesentlich übersichtlicher wird.

    C#-Quellcode

    1. foreach (var i in New RegEx("Pattern").Matches)
    2. {
    3. RichTextBox1.SelectionStart = i.Index;
    4. '...
    5. }
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Danke für die Antworten :)
    Ich möchte das Textfile in ein TexfileObject einlesen. Weiß nur nicht wie das genau geht :/. Es soll Zeile für Zeile eingelesen werden,das dann in einen Array abspeichern, den man dann mit einer Schleife durchsuchen kann.

    Quellcode

    1. string filepath;
    2. OpenFileDialog ofd = new OpenFileDialog();
    3. ofd.InitialDirectory = "C:\\";
    4. ofd.Filter = "Textdatei (*.txt) |*.txt";
    5. if (ofd.ShowDialog() == DialogResult.OK)
    6. {
    7. filepath = ofd.FileName;
    8. using (StreamReader sr = new StreamReader(filepath))
    9. {
    10. while (sr.Peek() >= 0)
    11. {
    12. textBox1.Text = sr.ReadToEnd();
    13. }
    14. sr.Close();
    15. }
    16. }


    So les ich es in eine Textbox bis jetz.Nur wie schreibe ich das alles in ein Array , damit ich mit einer schleife dann dieses Array dursuchen kann. Denn ich habe ja ein feld " Suchen". Damit ich mit der Schleife und dem suchbegriff durch das Array gehe und er mir dann jedes mal wenn er das Wort in einer Zeile gefunden hat, die komplette Zeile am besten in einer Listbox ausgibt. Mit einer While- Schleife müsste es ja funktionieren, weiß nur leider nicht genau wie das dann aussehen solll.

    Ich hoffe ihr könnt mir helfen
    Vielen Dank :)

    Quellcode

    1. private void button1_Click(object sender, EventArgs e)
    2. {
    3. string filepath;
    4. OpenFileDialog ofd = new OpenFileDialog();
    5. if (ofd.ShowDialog() == DialogResult.OK)
    6. {
    7. filepath = ofd.FileName;
    8. StreamReader sr = new StreamReader(filepath);
    9. string sLine = "";
    10. ArrayList arrText = new ArrayList();
    11. {
    12. while (sLine != null)
    13. {
    14. sLine = sr.ReadLine();
    15. if (sLine != null)
    16. arrText.Add(sLine);
    17. }
    18. sr.Close();
    19. foreach (string sOutput in arrText)
    20. richTextBox1.Text = arrText.Text;
    21. }
    22. }
    23. }


    Mein Code sieht jetz so aus. Aber ich bekomme immer nur die letzte Zeile aus meinem Textfile, in meine richtextbox angezeigt aber warum? Könnt ihr mir helfen ? Ist das denn überhaupt richtig , dass alle zeilen in meinem array drin sind?
    @Pr0gger:

    Schau Dir mal System.IO.File.ReadAllLines() an. Das gibt Dir ein Array von String zurück, bei dem jedes Element einer Zeile entspricht.
    Das kannst Du direkt in einer foreach-Schleife verwenden.

    Erklär uns mal etwas genauer deine TextFileObject-Klasse.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Habe es jetz geschafft meine datei in einen Array einzulesen :)

    Quellcode

    1. private void öffnenToolStripMenuItem_Click(object sender, EventArgs e)
    2. {
    3. string FileName = string.Empty;
    4. string filepath;
    5. OpenFileDialog ofd = new OpenFileDialog();
    6. if (ofd.ShowDialog() == DialogResult.OK)
    7. {
    8. filepath = ofd.FileName;
    9. StreamReader sr = new StreamReader(filepath, System.Text.Encoding.Default);
    10. string inhalt = sr.ReadToEnd();
    11. ArrayList Inhalt_Array = new ArrayList();
    12. Inhalt_Array.Add(inhalt);
    13. int i;
    14. int x = Inhalt_Array.Count;
    15. string str_display = string.Empty;
    16. for (i = 0; i < x; i++)
    17. {
    18. str_display += Inhalt_Array[i];
    19. }
    20. richTextBox1.Text = str_display;
    21. }
    22. }

    Nur wie Bau ich jetz eine Schleife, die Das Array dursucht nach einem Wort. Ich habe eine Textbox, in der in ein Wort eingebe mit Enter absende ( KeyDown). Dieses Woret soll dann mithilfe einer Schleife in meinem Array durchsucht werden. Wenn der Das Wort gefunden hat soll er mir die komplette Zeile in einer Listbox ausgeben. Wenn das Wort in weiteren Zeilen vorkommt soll er diese zeile(n) auch in die listbox schreiben. Wie kann ich das machen ? :/ Habt ihr vllt eine idee bzw beispiele?
    Was hast Du mit Deinem ArrayList?
    Wofür die Datei zeilenweise in ein Array kopieren, wenn doch alle Zeilen schon da sind?

    Entweder Du verwendest System.IO.File.ReadAllLines() um alle Zeilen auf einen Schlag auszulesen und bearbeitest diese dann, oder Du verwendest den StreamReader, um jede Zeile direkt aus der Datei zu bearbeiten (Einfacher ist ersteres, bei großen Dateien ist letzteres performanter).

    Du kannst Dir eine List<String> anlegen, in der Du alle Zeilen abspeicherst, in der das Wort vorkommt.

    Eine Zeile ist ein String. Mit Zeile.Contains(DerZuSuchendeString) kannst Du überprüfen, ob DerZuSuchendeString in der Zeile vorkommt. Wenn ja, fügst Du der List<String> die Zeile hinzu.

    Anschließend kannst Du mit String.Join("\r\n", DieListe.ToArray()) alle Einträge der Liste mit einem Zeilenumbruch zusammenkleben und das ergebnis dieser Funktion kannst Du irgendwo anzeigen.

    Alternativ: Statt der Liste verwendest Du einen System.Text.StringBuilder und hängst dem mit .AppendLine() die jeweilige Zeile an. Dann verwendest Du nicht String.Join... sondern die .ToString() Funktion des StringBuilders, um das Ergebnis zu erhalten.


    Edit:
    Und um dem Ganzen noch die Übersichtlichkeit zu geben, kann man LINQ verwenden:

    C#-Quellcode

    1. TextBox1.Text = String.Join("\r\n", from string p in System.IO.File.ReadAllLines() where p.Contains(DasWort) select p);


    Edit2:
    ArrayList ist untypisiert. Deshalb gibt es Arrays: String[] Bla; und Listen: List<String> Bla;
    Du hast nur glück, dass die foreach-Schleife intern eine Typenkonvertierung durchführt, denn das hier dürfte eigentlich nicht funktionieren:

    C#-Quellcode

    1. ArrayList Test = new ArrayList();
    2. Test.Add(new TableLayoutPanel());
    3. foreach (int i in Test)
    4. {
    5. MessageBox.Show(i.ToString());
    6. }

    Zur Laufzeit wird auch klar, dass ein TableLayoutPanel nicht in Integer konvertiert werden kann, aber zur Kompilierzeit ist noch nicht bekannt, was denn tatsächlich in der ArrayList drin ist. foreach greift nur auf die IEnumerable-Schnittstelle der ArrayList zu. Und die ist untypisiert (Object). Deshalb wird sowieso in den angegebenen Typ gecastet.
    List<T> und T[] (also Listen und Arrays) implementieren die IEnumerable<T> Schnittstelle, wobei T den Typ angibt. z.B. List<String> implementiert IEnumerable<String>. Deshalb kann foreach auf die IEnumerable<T> Schnittstelle zugreifen und zur Kompilierzeit feststellen, ob sich die Typen vertragen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()

    Es ist meine Aufgabe, jede einzelne Zeile in eine Arraylist abzuspeichern, daher mach ich es auch so. Aber Danke für den Tipp :) .
    Nun muss ich es nur noch schaffen, dass wenn ich in meine textbox ( Suchfeld) ein wort eingebe, dann die komplette Zeile vorkommt wo dieses Wort auftaucht. Dieses Wort kann auch in dem Text in einem ganz anderen wort drinstecken. Meine aufgabe ist es, es einmal so zu finden und die komplette zeile in eine neue listbox auszugeben und über eine Checkbox, die heißt "ganzes Wort". Wenn ich da den Haken reinsetze, sollen alle zeilen ausgegebn werden wo dieses Wort alleine steht. Also ein leerzeichen vor dem Wort und eins nach dem Wort. Es müsste mit regulären Ausdrücken gehen, aber ich weiß leider nicht wie. Habt ihr eine idee??

    Danke im Vorauss :)
    @Pr0gger: Wer hat sich die Aufgabe ausgedacht? Dein Lehrer? Dann sag ihm von mir bitte, dass er doch lieber ein einfacheres Fach unterrichten solle (Das ist natürlich nicht ernst gemeint, sag ihm das bloß nicht ;) )
    ArrayList ist in .Net-Zeiten nicht mehr nötig. Wie gesagt: Es gibt IEnumerable<T> und List<T>.
    Du könntest versuchen, ihm zu erklären, dass es sinnvoll ist, streng typisiert zu arbeiten.
    Nebnbei: Wenn's VB gewesen wäre, hätte ich vermutet, dass Du Option Strict Off hast, aber da Du mit C# arbeitest, gibt's das ja gar nicht. Ich frage mich, wie Du dann ein Element der ArrayList verwenden willst.
    "string Foo = Liste[0];" kann ja nicht funktionieren, weil der Ausdruck "Liste[0]" vom Typ Object ist. Castest Du dann jedes Mal?
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    - Das Textfile in ein TextfileObjekt einlesen
    o In einen Array schreiben, den man dann mit einer Schleife durchsuchen kann

    - Ganzes Wort ausfiltern

    - Die gefundenen Zeilen in die Suchergebnistextbox schreiben (Listbox schreiben)-

    Das Hier sind die Aufgaen die ich erledigen soll..

    Die gefundenen Zeilen mach ich über einen regulären Ausdruck
    Auf die art .suchbegriff. => also das vor dem such begriff und nach dem suchbegriff ein beliebens zeichen folgen kann. Hauptsache er findet dieses wort.

    Nur wie mach ich das mit dem array und dem Object?
    mann - langweil! - gugge post#7

    Edit: nee - ärger :cursing: :cursing: :cursing:
    Wieso warst du nicht gleich imstande, die Frage in post#7 auch nur zu berühren, zum Kuckuck? Ich find das unverschämt, wenn dir jmd hilft, und ganz gezielte und dich voranbringende Rückfragen stellt, wenn der einfach ignoriert wird.
    Und dumm ist das Verhalten ausserdem, weil logisch kommst du so nicht voran.

    Stattdessen präsentierst du iwelchen zusammenkopierten Ranz-Code, mit dem er sich jetzt auch noch auseinandersetzen darf.

    Wenn du was von den ausgezeichneten Tipps von Niko nicht verstehst, dann sag das bitte einfach. Das ist in keiner Weise abträglich, sondern dafür ist das Forum da.

    Aber fasel nicht einfach so weiter vor dich hin, als führest du Selbstgespräche.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hallo Niko,

    also ich habs am anfang überhaupt nicht verstanden, tut mir leid :/
    Ich werde es aber mit der List(string) so machen.
    Kannst du mir vllt zeigen wie das dann aussieht?
    Alle zeilen sind in einem string = str_display;
    Das Wort ist auch ein String den ich aus dieser einen Textbox raushole = word;

    Quellcode

    1. List<string> Word = new List<string>();


    so erstellt man die ja, soweit komme ich und ich verstehe auch wie du es machen würdest, nur kann ich es nicht umsetzen, da ich es so noch nie gesehen habe :/
    Kannst du mir dies vllt zeigen ?

    Quellcode

    1. if (str_display.Contains(wort)){
    2. }

    Nur wie adde ich die dann zu meiner liste und geb ich in meiner box aus? :/

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Pr0gger“ ()