2017-03-14 2 views
0

Ich versuche gierige Streichholzstring und markieren Sie es als Gruppe, bis es Raum Strich trifft (-). Bisher habe ich bekam:Leerzeichen Bindestrich als Trennzeichen für Gruppenübereinstimmung

^ *-{2}([\w\d-]+)(=([ \w\d-]+))?(.*)|(.+)

und mein Test-String ist:

--match1=match2 
--match1=match2 match2 
--match1=match2 match2-match2 
--mat-ch1=match2 match2 
--match1=match2-match2 match2 
--match1=match2 -lastmatch 
--match1=match2 --lastmatch 
--match1 -lastmatch 
--match1 --lastmatch 
lastormatch 

Jede jede Art von Spiel (match1, match2, lastmatch, lastormatch) sollten in Gruppen eingeteilt werden, wenn sie nebeneinander. Dies funktioniert für jede Zeile mit Ausnahme von 6 und 7. Grundsätzlich sollte '' als Begrenzer fungieren, wenn es um match2 Gruppe geht (aber - umgeben von /w/d ist in Ordnung als Teil der Zeichenfolge innerhalb der Gruppe). Ich weiß, dass Lookahead/Lookbehind verwendet werden sollte, aber ich kann es nicht richtig machen.

What I have Vergleich zu what I need

regex101.com

+0

Sie haben nicht konkretisieren, was und –

+0

7. 6 für Fälle ist genau Gruppenstruktur erwartet - (match1) = (match2) (-lastmatch) - (match1) = (match2) (--lastmatch) Lassen Sie uns sagen, dass hier Klammer zeigt, wo die Gruppe sein sollte. –

+0

Entschuldigung, keine Ahnung, was Sie brauchen. Bitte fügen Sie Erklärungen zu der Frage hinzu –

Antwort

0

Nicht ganz sicher, was Sie versuchen zu erreichen, aber basierend auf dem Bild „was ich brauche“ könnte dies ausreichen:

^ *-{2}([\w\d-]+)(=(?:[\w\d-]| (?!-))+)?(.*)|(.+)

Durch die Annahme entweder [\w\d-] oder Leerzeichen nicht gefolgt von - anstelle von [ \w\d-] scheint es für Sie Testdaten zu arbeiten.

Aber ohne genau zu verstehen, was Ihr Ziel ist, könnte es Probleme mit einem anderen Datensatz geben.

+0

Die Idee ist, Parameter zu erkennen, die an das Bash-Skript übergeben werden, da ich getopts nicht verwenden möchte. '^ * - {2} ([\ w \ d -] +) (= ((?: [\ W \ d-] | (?! -)) +))? (. *) | (. +) '(eine Klammer mehr) funktionierte genau so, wie ich es wollte. –

+0

@a_z Großartig! Ich bin froh, dass du es sortiert hast. Wenn Sie versuchen, die verschiedenen Argumente zu erfassen, dann vielleicht etwas in der Form von (?: -? ((?: [\ W \ d-] | (?! -)) +) =? ((?:) \ w \ d-] | (?! [-])) +)?) |^([^ -] +) $ 'könnte relevant sein - https://regex101.com/r/NVgqNe/1 – rvalvik

+0

Idee ist um die erste potentielle Option + optionale Eingabe (wie '-v' oder' -log-file = logfile') zu finden, wandle sie in 'verbose = true' oder 'log_file = logfile' in bash um, verschiebe die ursprüngliche Übereinstimmung vom Eingabe-Array und iteriere Trog Rest der Eingabe-Array. Ich bin noch nicht ganz fertig mit der Interpretation von einzelnen Optionen (wie -q oder -qwer mit optionaler Eingabe) noch, aber ich komme da :). http://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash ist ein guter Beitrag, aber jede Antwort fehlt ein wenig oder Code ist riesig. –

Verwandte Themen