如何在Groovy中获取String的每一行的第一个单词

时间:2017-09-07 21:27:14

标签: groovy jenkins-pipeline

我有一个返回多行String的方法。我想解析String并得到每一行的第一个单词。

方法getText()返回:

Lorem ipsum dolor 
sit amet odio 
magnis vitae iaculis

我想只获得

Lorem
sit
magnis

我目前的代码是

        def projectString = getText()
        def projects = projectString.substring(0, projectString.indexOf(' '))

当然只能获得第一行的第一个单词。我可以根据新行在字符串上使用while循环,并使用上面的substring方法获取第一个单词,但我感觉Groovy有一种更加流行的方法。

最初我考虑在方法调用结果上使用管道,所以像

def projects = getText() | sh "awk '{print $1}'"

但我无法让它发挥作用。

2 个答案:

答案 0 :(得分:5)

Here is an example:

def projectString = """Lorem ipsum dolor
sit amet odio
magnis vitae iaculis"""

projectString = projectString
    .readLines()
    .collect { it[0.. it.indexOf(' ')] }
    .join("\n")

println projectString

You can check it online: https://groovyconsole.appspot.com/script/5132242514870272

答案 1 :(得分:0)

Groovy具有与Perl类似的正则表达式模式的模式运算符~。下面的解决方案使用(?m)启用多行标记,^\w+在字符串的开头使用[A-Za-z0-9_]中的一个或多个。正则表达式表达式计算为Matcher对象,并从那里将所有匹配(每行的第一个单词)收集到列表中。

第二个解决方案以readLines()开始返回行列表,然后使用collect()的闭包重载将每行映射/转换为每行的第一个字,使用比典型更快的StringTokenizer字符串拆分。此外,似乎API建议基于其类似流的接口进行延迟评估,这比解析整个行更好,因为我们只想要第一个单词。

以下示例:

def foo = """Lorem ipsum dolor
sit amet odio
magnis vitae iaculis"""

println((foo =~ /(?m)^\w+/).collect())
println foo.readLines().collect { new StringTokenizer(it).nextElement() }

// both print [Lorem, sit, magnis]
相关问题