Zeichen zwischen Anführungszeichen finden

  • C#

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Zeichen zwischen Anführungszeichen finden

    Hallo,

    Ich suche nach einer Möglichkeit zu prüfen ob ein Zeichen z.B. ! nicht zwischen zwei Anführungszeichen oder Hochkommata steht. Mein Ansatz ist folgender:

    Quellcode

    1. public class Range {
    2. int begin;
    3. int end;
    4. public Range(int begin, int end) {
    5. this.begin = begin;
    6. this.end = end;
    7. }
    8. public Boolean inRange(int num)
    9. {
    10. return (num >= begin && num <= end);
    11. }
    12. }
    13. public List<Range> getQuotationRanges(string document)
    14. {
    15. List<Range> rng = new List<Range>();
    16. Boolean quot = false;
    17. int firstquot = 0;
    18. int secondquot = 0;
    19. for (int i = 0; i < document.Length; i++)
    20. {
    21. char c = document[i];
    22. if (c == '"' || c == '\'')
    23. {
    24. if (!quot)
    25. {
    26. firstquot = i;
    27. quot = true;
    28. continue;
    29. }
    30. if (quot)
    31. {
    32. secondquot = i;
    33. rng.Add(new Range(firstquot, secondquot));
    34. quot = false;
    35. }
    36. }
    37. }
    38. return rng;
    39. }


    Für das was ich mit dem Zeichen anschließend vorhabe brauche ich den Index des Zeichens, deswegen sieht die Überprüfung so aus:

    Quellcode

    1. List<Range> rngs = getQuotationRanges(document);
    2. for (int i = 0; i < document.Length; i++)
    3. {
    4. char c = document[i];
    5. if (c == SpecialChar)
    6. {
    7. Boolean inQuotes = false;
    8. foreach (Range rn in rngs)
    9. {
    10. if (rn.inRange(i)) { inQuotes = true; }
    11. }
    12. if (inQuotes == false)
    13. \\do stuff
    14. }
    15. }


    Das funktioniert sosweit auch ganz gut, nur sobald Escapesequenzen dazukommen klappt es nicht mehr. Beispiel:

    Quellcode

    1. "Dies ist ein Füll-Text \"<SpecialChar>\""

    Das SpecialChar wird behandelt als ob es nicht zwischen zwei Anführungszeichen steht, was ja im Grunde genommen auch stimmt, dennoch soll die Funktion dafür true zurückgeben.
    Gibt es dafür vielleicht eine schöne Möglichkeit RegEx zu verwenden und anschließend an den Index des Zeichens zu kommen? Die Lösung sollte relativ performant sein, da sie auch auf große Texte angewendet werden soll.

    8-) faxe1008 8-)

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

    Vielleicht hilft Dir mein VB-Code, der leicht in C# zu übertragen ist:

    Quellcode

    1. Sub Filtern(ByVal Tx As String, ByVal Ziel As ListBox)
    2. Ziel.Items.Clear()
    3. Dim Ix1, Ix2 As Integer
    4. Dim Wort As String
    5. Ix1 = Tx.IndexOf(Chr(34))
    6. Do While Ix1 > -1
    7. Ix2 = Tx.IndexOf(Chr(34), Ix1 + 1)
    8. Wort = Tx.Substring(Ix1 + 1, Ix2 - Ix1 - 1)
    9. Ziel.Items.Add(Wort)
    10. Ix1 = Tx.IndexOf(Chr(34), Ix2 + 1)
    11. Loop
    12. End Sub


    Gruß
    Horst
    @faxe1008 Suchst Du die Zeilen im C#-Quellcode
    oder
    suchst Du die Zeichen in einem freien Text?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!