2017-04-24 1 views
0

Ich versuche, alle Header eines bash CURL-Befehls mit RegEx-Gruppenerfassung zu bekommen, aber ich habe ein Problem, wo es nur alle Header in einer Gruppe (und anderen) greift Gruppe, die ich nicht genau weiß, warum es passiert).Erhalte individuelle Header von CURL mit Regex Group

Die bash:

curl '<url>' -H 'origin: <url>' -H 'accept-endocing: <...>' -H 'accept-language: <...>' <continues with more headers> --data '<...>' 

und es geht mit anderen Header auf.

Der Code:

var rawBash = RawBash.Text; 
var headerPattern = @"\-H[\s][\']{1}(.+)[\']{1}"; 
var headers = Regex.Match(rawBash, headerPattern); 

Ich habe tested the pattern here und es sagt, „11 Captures“ und ‚korrekt‘ bezeichnet die Gruppen I erfasst werden sollen, aber wenn ich den Code debuggen bedeutet dies, dass zwei Gruppen aufgenommen wurden :

  1. die gesamte WELLUNG mit dem ersten "-H"
  2. die gesamte WELLUNG beginnend mit dem Start "Herkunft:"

Was passiert? Ich nehme an, die Regex nimmt die (.+) und nicht beendet, wenn es die [\']{1} trifft, weil ' entspricht (.+) ... aber wie mache ich es erfassen jeden einzelnen Header in einer Gruppe?

Ich habe versucht, ein paar C# RegEx Tutorials/Beschreibungen zu lesen, aber ich konnte nicht finden, wonach ich suche (oder beschreiben, was ich in der richtigen Formulierung suche).

EDIT: Buchstäblich Sekunden nach der Einlieferung hatte ich die Idee, dieses Muster zu versuchen:

var headerPattern = @"\-H[\s][\']{1}([^\']+)[\']{1}"; 

Beachten Sie die Gruppe jetzt ist ([^\']+) statt (.+). Es funktioniert jetzt so, wie ich es möchte.

Auch ich benutze Regex.Match(...), und es sollte Regex.Matches(...) sein, um alle Übereinstimmungen zu erhalten.

Aber ich denke, die Frage steht irgendwie noch; Wie kann jemand eine Gruppenaufnahme an einem Punkt beenden? Ich erinnere mich an einen Freund mit dem Begriff forward lookup in dem, was ich glaube, war eine ähnliche Situation, aber ich habe keine Ahnung, wie zu implementieren.

Antwort

1

Was Sie sehen, ist die Auswirkungen von gierigen vs faulen (oder nicht-gierigen) Übereinstimmungen.

Gierige Übereinstimmung wird mit so vielen Zeichen wie möglich übereinstimmen Faule Übereinstimmung wird nur so viele Zeichen wie erforderlich übereinstimmen.

In Ihrem ursprünglichen Muster (.+) ist ein gieriger Abgleich von einem oder mehreren oder einem beliebigen Zeichen. So ist es von Ihrem ersten -H ' zur letzten '

greifen wird, was Sie es geändert, ([^\']+), ist auch gierig, aber seine endet früh, weil es nicht alle Zeichen übereinstimmt, seine einzige Wort entsprechen und kein ' sind.

Sie können eine * oder + zu faul ändern, indem Sie direkt danach eine ? hinzufügen.

Meine Lösung für Ihre Header-Matcher ist (vorausgesetzt, Ihre Beispiel-String ist ziemlich repräsentativ für ein konsistentes Format).

\-H\s+\'(.+?)\' 

Ihr Freund bezieht sich auf einen positiven Lookahead. Es wird in der Zeichenfolge nach einer erfolgreichen Übereinstimmung gesucht, wobei die Übereinstimmung jedoch nicht Teil der vollständigen Übereinstimmungszeichenfolge ist. Die Syntax lautet (?=...). Es gibt auch einen negativen Lookahead (?!...) und positive und negative Lookbehinds, (?<=...) bzw. (?<!...). Sie sollten mit Vorsicht verwendet werden, da sie bei längeren Strings sehr effizient sein können.

Zum Beispiel werden die folgenden zwei Strings:

regex isnt always the right answer|this will match 

regex isnt always the right answer|this will not 

wenn ich das folgende Muster verwendet:

regex (is.*) always (the right answer(?=.*this will match)) 

in dieser für die erste Saite führen wird:

Full match 0-34 `regex isnt always the right answer` 
Group 1. 6-10 `isnt` 
Group 2. 18-34 `the right answer` 

und passt überhaupt nicht zum zweiten.

+0

Super, danke für die schnelle Antwort! Wenn ich es richtig verstehe, zwingt das '?' Faul, weil es im wesentlichen '0 || 1 'auf dem vorhergehenden' 0 + '/' 1 + 'ausführt, um die minimale Übereinstimmung sicherzustellen? – Daevin

+0

das '?' Ist nur die Syntax für eine Lazy Repeating Charakter - http://www.regular-expressions.info/repeat.html –