RegEx IsMatch ist langsam

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    ErfinderDesRades schrieb:

    ^[\[\(](.*)[\]\)]\s*[\[\(]([a-zA-Z])[\]\)](.*)[\[\(]([a-zA-Z])[\]\)](.*)

    Ist da nicht ein kleiner Fehler?
    Müssen die Leerzeichen nach jeder eckigen Klammer nicht existieren?
    Also:

    Quellcode

    1. [PLATFORM] (B) itemB [X] itemX
    - korrekt

    Quellcode

    1. [PLATFORM](B) itemB [X] itemX
    - sollte doch inkorrekt sein?

    Also ohne Kleene-Star:

    Quellcode

    1. ^[\[\(](.*)[\]\)]\s+[\[\(]([a-zA-Z])[\]\)]\s+(.*)\s+[\[\(]([a-zA-Z])[\]\)]\s+(.*)

    oder

    Quellcode

    1. ​^[\[\(]([a-zA-Z]+)[\]\)]\s+[\[\(]([a-zA-Z])[\]\)]\s+(.*)\s+[\[\(]([a-zA-Z])[\]\)]\s+([a-zA-Z])*(\.*)

    Und Gott alleine weiß alles am allerbesten und besser.

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

    Okay.

    @φConst: Also nehm ich den Zeitaufwand für endliche Automaten und vergleich den mit einem RegexPatter zu schreiben muss ich sagen, gefällt mir regex mehr allein schon weil ich ohne mühe Dinge ändern kann
    Zb: Gruppen hinzufügen, oder sobald eine änderung auftritt sie in weniger als 2min ins pattern bekomme.

    Nehm ich an der der Quellcode liegt schon 2 Jahre in der Ecke: So muss ich sagen ist ein regex schneller angepasst als ein Quellcode den ich erst wieder Studiern muss um die Stelle zu finden an der ich meine änderung machen muss
    Nicht das ich den Regex auch verstehen muss, aber dafür gibt es webseiten/tools die mir die arbeit erleichten.

    Performenc technisch gewinnst du zu 100% ... aber von der Dynamität und anpassbarkein, verlierst du zu 100%
    Vorteil, der Automat ist auf ein Problem zugeschnitten, was bedeutet ich hab/kann keine/sollte exoten dabei sein.

    @ClonkAndre
    regexr.com/ ist ne coole seite aber kann auch schnell seine Grenzen haben.
    deswegen nutz ich fürs schreiben immer regex101.com/ und kopier mir das dann in regexr.com
    PS: regex101 hab ab und an mal das problem das die regex engine abkackt, einfach an der seite kurz die sprache hin und her schalten :D


    Mein meinung!!

    Facebamm schrieb:

    Also nehm ich den Zeitaufwand für endliche Automaten und vergleich den mit einem RegexPatter zu schreiben muss ich sagen, gefällt mir regex mehr allein schon weil ich ohne mühe Dinge ändern kann
    Zb: Gruppen hinzufügen, oder sobald eine änderung auftritt sie in weniger als 2min ins pattern bekomme.


    Kein Zweifel ;), aber sein Problem war ja die Performance - und weil das Problem eher simpel ist, wäre ein selbst konstruierter, endlicher Automat wahrscheinlich die bessere Alternative gewesen, nicht zu vergessen der zusätzliche Lerneffekt, das auch eine Rolle spielen sollte.
    Aber wie man's nimmt. Will gar keine Diskussion entfachen.
    Und Gott alleine weiß alles am allerbesten und besser.
    @φConst

    Folgende Formate vom Text sollen erlaubt sein:
    (PC) (H) ... (W) ...
    (Xbox)(W)...(H)...
    [PSN] [H] ... [W] ...
    [Switch][H]...[W]...

    Oder halt auch so wenn der User das so mag: [PC] (H) ... (W) ...

    Zusammengefasst: Das wichtige ist nur was in den Klammern steht alles andere ist egal.

    @Facebamm
    Danke für die Seite! :)
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    Addendum: Mir fällt ein: Es ist unsinnig die beiden Fällen (jeweils eckige Klammern, und runde Klammern) im regulären Ausdruck auszuformulieren.
    Mach einfach ein string.replace("(", "[").replace(")", "]"); und prüfe ausschließlich auf die eckigen Klammern - das sollte den Prozess eventualiter beschleunigen.
    Im Grunde sind diese Sprachen nämlich äquivalent - sie unterscheiden sich nur in einem einzelnen Zeichen. Warum also bitteschön sowohl den Fall '(', als auch den Fall '[' separat behandeln?
    Damit wären sämtliche |-Verknüpfungen nicht mehr nötig - der Ausdruck wird übersichtlicher, und die Erzeugung eines endlichen Automaten sollte entsprechend schneller vonstatten gehen.

    Hier der überarbeitete endliche Automat oben:

    Spoiler anzeigen

    C#-Quellcode

    1. public class SpecifiedFiniteStateMachine
    2. {
    3. public enum State
    4. {
    5. qInit,
    6. qBracketOpen0,
    7. qBracketClose0,
    8. qBracketOpen1,
    9. qBracketClose1,
    10. qBracketOpen2,
    11. qBracketClose2,
    12. qFinal
    13. }
    14. public State AcceptingState { get; set; }
    15. public bool Accept(string input)
    16. {
    17. input = input.Replace("[", "(").Replace("]", ")");
    18. State currentState = State.qInit;
    19. int index = 0;
    20. while(index < input.Length && currentState != AcceptingState)
    21. {
    22. var t = input[index];
    23. switch (currentState)
    24. {
    25. case State.qInit:
    26. if (input[index++] == '(')
    27. currentState = State.qBracketOpen0;
    28. else return false;
    29. break;
    30. case State.qBracketOpen0:
    31. if (input[index++] == ')')
    32. currentState = State.qBracketClose0;
    33. break;
    34. case State.qBracketClose0:
    35. if (input[index++] == '(')
    36. {
    37. currentState = State.qBracketOpen1;
    38. index++;
    39. }
    40. break;
    41. case State.qBracketOpen1:
    42. if (input[index++] == ')')
    43. currentState = State.qBracketClose1;
    44. else return false;
    45. break;
    46. case State.qBracketClose1:
    47. if (input[index++] == '(')
    48. {
    49. currentState = State.qBracketOpen2;
    50. index++;
    51. }
    52. break;
    53. case State.qBracketOpen2:
    54. if (input[index++] == ')')
    55. currentState = State.qBracketClose2;
    56. else return false;
    57. break;
    58. case State.qBracketClose2:
    59. currentState = State.qFinal;
    60. break;
    61. }
    62. }
    63. return currentState == AcceptingState;
    64. }
    65. }


    Aufruf:
    Spoiler anzeigen

    C#-Quellcode

    1. SpecifiedFiniteStateMachine specifiedFiniteStateMachine
    2. = new SpecifiedFiniteStateMachine();
    3. specifiedFiniteStateMachine.AcceptingState = SpecifiedFiniteStateMachine.State.qFinal;
    4. string s = "[PLATFORMa]a[B]nrgrnk[W]itemW ";
    5. Console.WriteLine(specifiedFiniteStateMachine.Accept(s));
    6. Console.Read();

    Und Gott alleine weiß alles am allerbesten und besser.

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