[英]How to get the first word of every line of a String in Groovy
我有一個返回多行字符串的方法。 我想解析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}'"
但是我無法解決這個問題。
這是一個例子:
def projectString = """Lorem ipsum dolor
sit amet odio
magnis vitae iaculis"""
projectString = projectString
.readLines()
.collect { it[0.. it.indexOf(' ')] }
.join("\n")
println projectString
您可以在線檢查它: https : //groovyconsole.appspot.com/script/5132242514870272
Groovy具有類似於Perl的正則表達式模式的模式運算符~
。 下面的解決方案使用(?m)
啟用多行標志,並使用^\\w+
捕獲字符串開頭的[A-Za-z0-9_]中的一個或多個。 regex表達式計算為Matcher對象,然后從那里將所有匹配項(每行的第一個單詞)收集到一個列表中。
第二種解決方案以readLines()返回行列表開始,然后使用collect()的閉包重載使用StringTokenizer將每行映射/轉換為每行的第一個單詞,這比典型的String拆分要快。 同樣,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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.