1

Groovy と正規表現を使用して、これを変換するにはどうすればよいですか:

String shopping = "SHOPPING LIST(TOMATOES, TEA, LENTIL SOUP: packets=2) for Saturday"

印刷する

Shopping for Saturday
TOMATOES
TEA
LENTIL SOUP (2 packets)
4

2 に答える 2

3

私は正規表現の第一人者ではないので、変換を行うための正規表現が見つかりませんでしたreplaceAll(そのようにすることは可能だと思います)。これはうまくいきます:

def shopping = "SHOPPING LIST(TOMATOES, TEA, LENTIL SOUP: packets=2) for Saturday"

def (list, day) = (shopping =~ /SHOPPING LIST\((.*)\) for (\w+)/)[0][1,2]
println "Shopping for $day\n" + 
        list.replaceAll(/: packets=(\d+)/, ' ($1 packets)')
            .replaceAll(', ', '\n')

"TOMATOES, TEA: packets=50, LENTIL SOUP: packets=2"最初に、文字列and"Saturday"を変数listand にそれぞれキャプチャしますday。次に、list文字列を処理して目的の出力に変換し、"packets="出現箇所を置き換え、リストをコンマで分割します (.replaceAll(', ', '\n')は と同等です.split(', ').join('\n'))。

注意すべきことの 1 つは、shopping文字列が最初の正規表現と一致しない場合、最初の一致 ( [0]) にアクセスしようとすると例外がスローされることです。次のようにすることでそれを回避できます。

(shopping =~ /SHOPPING LIST\((.*)\) for (\w+)/).each { match, list, day ->
    println "Shopping for $day\n" + 
            list.replaceAll(/: packets=(\d+)/, ' ($1 packets)')
                .replaceAll(', ', '\n')
}

最初の正規表現が一致しない場合、何も出力されません。

于 2012-06-30T18:02:59.700 に答える
1

私はこのような場合に String メソッドを使用するのが好きです。構文findよりも明確だと思います。=~

String shopping = "SHOPPING LIST(TOMATOES, TEA, LENTIL SOUP: packets=2) for Saturday"

def expected = """Shopping for Saturday
TOMATOES
TEA
LENTIL SOUP (2 packets)"""


def regex = /SHOPPING LIST\((.*)\) for (.+)/

assert expected == shopping.find(regex) { full, items, day ->
    List<String> formattedItems = items.split(", ").collect { it.replaceAll(/: packets=(\d+)/, ' ($1 packets)') }
    "Shopping for $day\n" + formattedItems.join("\n")
}
于 2012-07-01T00:56:39.303 に答える