2016-04-26 18 views
3

Ich wollte eine Linie entsprechen, die wie folgt strukturiert:Regex dauert eine lange Zeit in Anspruch

  • Beginn der Linie
  • Multiple ‚-‘
  • Vielleicht ein weißer Raum (vielleicht auch mehr)
  • mindestens ein Zeichen
  • vielleicht mehr Zeichen und weißen Räume
  • vielleicht ein weißer Raum (vielleicht auch mehr)
  • Multiple '-'
  • Zeilenende

Also schrieb ich die Regex wie folgt aus:

new Regex(@"^\-{2,}\s*(\w+(\w+|\s)*)\s*\-{2,}$"); 

Und wenn ich versuche, die folgende Zeile passen, das dauert ewig zu vervollständigen (didn‘ t warten, bis es vollständig):

-------- Variable used for recipe visualization only - Not loaded into PLC -------- 

ich denke, es ist eine sehr große Anzahl von Spielen in diesem und dem Regex haben all diese Begegnungen schwer aufzuzählen, aber ich bin nicht sur e.

Umwelt Informationen: Windows 7, framework 3.5

Danke

Edit: Dank Ihrer Hilfe kam ich mit einem Regex up, das funktioniert:

^-{2,}\s*(?!\-)(\w(?:\w|\s|\-)+)(?<!\-)\s*-{2,}$ 

So ist die Interpretation:

  • Beginn der Zeile
  • Mindestens zwei '-'
  • Vielleicht ein weißer Raum (vielleicht auch mehr)
  • No more '-'
  • Mindestens ein Zeichen
  • Vielleicht mehr Zeichen, Leer- oder '-'
  • No more '-'
  • vielleicht ein weißer Raum (vielleicht auch mehr)
  • mindestens zwei '-'
  • Zeilenende

Wenn Sie mit ihm etwas nicht in Ordnung sehen Bitte sagen Sie mir

+1

Das wird wegen des internen Sprungs in "nur - Not" nicht übereinstimmen. – juharr

+1

Ihr Problem ist, dass Sie nicht zulassen, dass die '-' in der Mitte erfasst werden – Jonesopolis

+1

Ich habe gerade versucht, dies auf https://myregextester.com/index.php und es lief in 0,018301 Sekunden. Aber es dauert sehr lange in C# zu laufen, aber das Entfernen dieses internen Dashboards beschleunigt es wirklich. – juharr

Antwort

4

ausrollen verschachtelte Gruppierung als

^-{2,}\s*(\w+(?:\s+\w+)*)\s*-{2,}$ 
      ^^^^^^^^^^^ 

Andernfalls wird Ihr Muster zu catastrophic backtracking anfällig sein.

Siehe regex demo

Alternativ verwenden Sie eine Atomgruppe, jeden Rückzieher in die Wechsel-Gruppe zu deaktivieren:

^-{2,}\s*((?>\w+(?:\w+|\s)*))\s*-{2,}$ 
      ^^^   ^

this regex demo

Siehe Im Allgemeinen vermeiden Abwechslungen mit verschachtelten quantifiers (wie in (\w+|\s)*) in längeren Mustern.

+0

heraus Bearbeitete meine Antwort, um eine Regex einzuschließen, die für diesen Fall funktioniert. Könntest du einen Blick darauf werfen und mir sagen, ob etwas nicht in Ordnung ist? Danke – nkoniishvt

+2

Die Regex ist nicht optimal. '(?! -)' ist völlig redundant, da das nächste Untermuster '\ w' ist und somit das Vorausschaucheck-Ergebnis immer * wahr * ist. Ich würde umschreiben wie '^ - {2,} \ s * (\ w + (?: [\ S -] + \ w +) *) \ s * - {2,} $ '(das' (?

+0

Vielen Dank für all diese Informationen – nkoniishvt