2016-12-21 2 views
0

Я очень новичок в использовании groovy. Особенно, когда речь идет о Jenkins + Groovy + Pipelines.Jenkins and Groovy и Regex

У меня есть строковая переменная, которая может время от времени меняться и хочет применить регулярное выражение для размещения 2 или 3 возможных результатов, которые может возвращать строка.

В моем заводной коде нет:

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

Но я получаю сообщение об ошибке на выходе Дженкинс:

hudson.remoting.ProxyException: groovy.lang.MissingMethodException: Нет подписи метода: java.util.regex.Pattern.matches() применим для типов аргументов: (java.lang.String)

UPDATE: Мне удалось создать довольно изящный джининг groovy while в задании конвейера, который я создаю, чтобы дождаться удаленного процесса, используя здесь информацию regex и подсказку в другом сообщении (do .. while() in Groovy with inputStream?).

  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

Я кончался вынимая линию «утверждать» и просто делать «г = ~/Бег | начиная | остановленные /» спасибо @injecteer – JuanD

ответ

0

Прямодушная будет:

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

Всегда ли вернул TRUE, найдет ли он совпадение или нет? – JuanD

+0

'assert' никогда не должен возвращаться в производственном коде. он обычно используется вначале для проверки предпосылок – injecteer

+0

: какой был бы лучший подход для принятия решения о том, есть ли совпадение (например, ввод и последующий разрыв цикла while)? – JuanD

0

matches не получает String.

Попробуйте

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

Если вы используете только это регулярное выражение здесь вы можете попробовать следующее:

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" 

Объяснение:

(.*) - 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 

==~ Оператор - groovy binary match operator. Это вернет true, если он совпадает, иначе false

См this example на регулярное выражение 101

+0

Благодарим за подробное объяснение и ссылки. В конце концов, использование '= ~' вместо '== ~' работало для меня так, как я хотел использовать этот код. – JuanD

+0

В вашем случае результат будет таким же. Однако '= ~' вернет объект регулярного выражения, который является 'null ', когда нет совпадения. 'assert null' будет утверждать. Поэтому он будет работать. Поскольку вы не используете объект, вам необязательно нужен объект. Булева будет достаточно. Не знаю о различиях в производительности и памяти, хотя в этом случае они будут очень маленькими.'== ~' вернет 'true' в первом совпадении и поэтому будет в одно и то же время в худшем случае. – Rik

+0

Но рад, что это помогло. Regex101 - отличный сайт, если вы хотите проверить регулярные выражения btw – Rik