簡體   English   中英

如何在Groovy中獲取字符串的每一行的第一個單詞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM