Regular Expressions mit vorherigem Zeichen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von SeriTools.

    Regular Expressions mit vorherigem Zeichen

    Guten Morgen.
    Ich habe diesen Input:
    \Projects\name\name\Form1.cs:Zeile 25.
    Als Output will ich "Form1.cs:Zeile25." haben.
    Dieses Pattern habe ich bisher:
    Zeile.(.*?[0-9]{0,4})
    Nun suche ich verzweifelt den "Befehl" noch alles mitzunehmen ab dem letzten vorherigen Backslash.
    Hat da jemand eine Idee ?
    Wie wäre es mit sowas ?

    VB.NET-Quellcode

    1. Dim inp As String = "\Projects\name\name\Form1.cs:Zeile 25."
    2. Dim pLength As Integer = inp.Split("\"c).Count
    3. Dim pattern As String = ""
    4. For i = 0 To pLength - 2
    5. pattern &= "\\.+"
    6. Next
    7. pattern = pattern.TrimEnd({"+"c, "."c})
    8. inp = Regex.Replace(inp, pattern, "", RegexOptions.IgnoreCase)
    9. MessageBox.Show(inp)

    Kleiner Umweg, aber funktioniert.
    Ist es nicht einfacher mit LastIndexOf:

    VB.NET-Quellcode

    1. Dim txt = "\Projects\name\name\Form1.cs:Zeile 25."
    2. Dim txt2 = txt.Substring(txt.LastIndexOf("\"c) + 1)
    3. MessageBox.Show(txt2)
    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!
    Ja so wäre das auch möglich, aber ich würde das gerne komplett mit RegEx machen, da mein Text nur ein Ausschnitt aus einem großen Text ist und mir das so zu umständlich ist.
    Trotzdem danke für die Lösung, die nehme ich dann als Übergangslösung :)

    @RodFromGermany
    Ja das ginge glaube ich auch, aber wie gesagt habe ich einen recht großen Text und dieser Teil ist nur ein kleiner Ausschnitt.
    Ich kenne mich mit RegEx-Patterns leider nicht so gut aus, aber ein theoretischer Ansatz wäre: Bringe den Doppelpunkt, den Punkt und zwei Backslashes explizit mit in das Pattern (also ohne Platzhalter), dann kann nur noch der hintere Teil gefunden werden, da diese Zeichen weiter vorne ja nicht auftauchen.
    Danke so hab ich es gelöst. Hab es halb und halb gemacht.

    C-Quellcode

    1. public static string GetZeile(string input)
    2. {
    3. string[] result = input.Split('\n');
    4. foreach (string b in result)
    5. {
    6. Regex r = new Regex(pattern);
    7. MatchCollection matches = r.Matches(b);
    8. if (matches.Count > 0)
    9. {
    10. return b.Substring(b.LastIndexOf(@"\" , b.Length - 1) + 1);
    11. }
    12. }
    13. return "";
    14. }

    Pattern ist: "Zeile.([0-9]{1,7})"
    Hi
    willst du den StackTrace für eine Exception auslesen? Wenn ja, schau' dir mal die Überladungen des StackTrace-Konstruktors an:

    C-Quellcode

    1. try {
    2. Test(12);
    3. } catch (Exception ex) {
    4. StackTrace stc = new StackTrace(ex, true);
    5. System.Text.StringBuilder frames = new System.Text.StringBuilder();
    6. int i = 0;
    7. frames.Append(ex.GetType().FullName).Append(": ").AppendLine(ex.Message);
    8. foreach (object sf_loopVariable in stc.GetFrames()) {
    9. sf = sf_loopVariable;
    10. System.Reflection.MethodBase method = sf.GetMethod();
    11. frames.Append(' ', i << 1).Append(sf.GetFileName()).Append(": ");
    12. if (method.DeclaringType != null) {
    13. frames.Append(method.DeclaringType.FullName).Append(Type.Delimiter);
    14. }
    15. frames.Append(method.Name);
    16. frames.Append(" at line ").Append(sf.GetFileLineNumber()).Append(", column ").Append(sf.GetFileColumnNumber()).AppendLine();
    17. i += 1;
    18. }
    19. MessageBox.Show(frames.ToString());
    20. }

    C-Quellcode

    1. private void Test(int index)
    2. {
    3. if (index < 0)
    4. throw new ArgumentException();
    5. Test(index - 1);
    6. }


    Edit: Etwas mehr ergänzt. Btw. warum eig C# Code im VB-Bereich?

    Gruß
    ~blaze~

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „~blaze~“ ()

    Da .net einen der wenigen Regex-Parser hat, der look-arounds mit variablen Längen erlaubt geht auch das:

    Quellcode

    1. (?<=(\\Projects\\.*\\.*\\)).*


    VB.NET-Quellcode

    1. Dim r As New Regex("(?<=(\\Projects\\.*\\.*\\)).*")
    2. Dim m as Match = r.Match("\Projects\name\name\Form1.cs:Zeile 25.")
    3. If m.Success Then Console.WriteLine(m.Value)


    Gibt Form1.cs:Zeile 25. zurück.
    lg SeriTools
    | Keine Fragen per PN oder Skype.

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