2016-12-21 17 views
0

Ich bin sehr neu im Umgang mit groovy. Besonders wenn es um Jenkins + Groovy + Pipelines geht.Jenkins und Groovy und Regex

Ich habe eine String-Variable, die von Zeit zu Zeit ändern kann und eine Regex anwenden möchte, um die 2 oder 3 möglichen Ergebnisse zu berücksichtigen, die die Zeichenfolge zurückgeben kann.

In meinem groovy Code ich habe:

r = "Some text that will always end in either running, stopped, starting." def regex = ~/(.*)running(.*)/ assert regex.matches(r)

Aber ich erhalte einen Fehler in der Ausgabe jenkins:

hudson.remoting.ProxyException: groovy.lang.MissingMethodException: Keine Unterschrift der Methode: java.util.regex.Pattern.matches() gilt für die Argumenttypen: (java.lang.String)

UPDATE: Ich war in der Lage, eine ziemlich geschickte jenking groovy While-Schleife in einem Pipeline-Job zu erstellen ich auf einen Remote-Prozess mit der Regex-Info hier und einen Tipp in einem anderen Beitrag (do .. while() in Groovy with inputStream?) warten warten.

  while({ 
       def r = sh returnStdout: true, script: 'ssh "Insert your remote ssh command that returns text' 
       println "Process still running. Waiting on Stop" 
       println "Status returned: $r" 
       r =~ /running|starting|partial/ 
      }()); 
+0

ich die ‚assert‘ Linie Entnahme endete und nur tun, ‚r = ~/Laufen | Start | gestoppt /‘ Dank @injecteer – JuanD

Antwort

0

Unkomplizierte wäre:

String r = "Some text that will always end in either running, stopped, starting." 
assert r =~ /(.*)running(.*)/ 
+0

Liefert assert immer TRUE, ob es eine Übereinstimmung findet oder nicht? – JuanD

+0

'Assert' sollte niemals im Produktionscode zurückgegeben werden. Es wird normalerweise am Anfang verwendet, um die Voraussetzungen zu überprüfen – injecteer

+0

Was wäre der beste Ansatz, um Maßnahmen zu ergreifen, ob es eine Übereinstimmung gibt oder nicht (zum Beispiel Eingabe und dann brechen eine While-Schleife)? – JuanD

0

matches empfängt keine Zeichenfolge.

Versuchen

Pattern.compile("your-regex").matcher("string-to-check").find() 
0

Wenn Sie nur diese Regex hier können Sie versuchen, die folgenden:

r = "Some text that will always end in either running, stopped, starting." 
assert r ==~ /(.*)(running|stopped|starting)\.?$/, "String should end with either running, started or stopped" 

Erläuterung:

(.*) - matches anything 
(running|stopped|starting) - matches either running, stopped or starting 
\.? - optionally end with a dot expect zero or one occurrence of a dot, but you need to escape it, because the dot is a regex special character 
$ - end of the line, so nothing should come after 

der ==~ Operator ist der groovige binary match operator. Dies wird true zurück, wenn sie paßt, sonst false

this example auf regex Siehe 101

+0

Vielen Dank für die gründliche Erklärung und die Links. Am Ende funktionierte die Verwendung von '= ~' anstelle von '== ~' für mich so, wie ich diesen Code verwenden wollte. – JuanD

+0

In Ihrem Fall ist das Ergebnis dasselbe. Allerdings gibt '= ~' ein Regex-Objekt zurück, das 'null' ist, wenn keine Übereinstimmung vorliegt. 'assert null' wird bestätigen. Deshalb wird es auch funktionieren. Da Sie das Objekt nicht verwenden, benötigen Sie das Objekt nicht unbedingt. Ein Boolescher Wert wird ausreichen. Ich weiß nichts über Performance und Speicherunterschiede, obwohl sie in diesem Fall sehr klein sein werden.Das '== ~' wird beim ersten Match 'wahr' zurückgeben und wird daher im schlimmsten Fall die gleiche Zeit dauern. – Rik

+0

Aber froh, dass es geholfen hat. Regex101 ist eine großartige Seite, wenn Sie reguläre Ausdrücke btw validieren wollen – Rik