我有一个返回多行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}'"
但我无法让它发挥作用。
答案 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]