3

PascalCase のテキストを含む文字列があり、最初の単語を抽出して小文字に変換する必要があります。

assert firstWord('PmdExtension') == 'pmd'
assert firstWord('PMDExtension') == 'p'
assert firstWord('Pmd') == 'pmd'
assert firstWord('CodeQualityExtension') == 'code'

static String firstWord(String word) {
    return '???'
}

有効な PascalCase 識別子のみに注目しましょう (他の文字や数字は使用せず、常に大文字で始まります)。

私の問題に対するシンプルでクリーンな解決策は何ですか?

私はもう試した

word.split(/[A-Z]/).first().join(' ')

ただし、大文字をすべて削除しますが、大文字を保持する必要があります。

4

4 に答える 4

2

何かのようなもの:

static String firstWord(String word) {
    return word[0].toLowerCase()+word.split(['A'..'Z'].join('|'))[1]
}
于 2016-08-26T12:19:15.923 に答える
1

このinjectメソッドを使用して、2 番目の大文字が検出されるまで文字を累積できます。

def firstWord(String word) {
    def numCapsObserved = 0
    def initVal = ""

    word.inject(initVal, { val, letter -> 
        def result = val
        if (letter ==~ /[A-Z]/) { numCapsObserved++ } 

        if (numCapsObserved < 2) {
            result += letter.toLowerCase() 
        }
        return result
    }) 
}

assert firstWord('PmdExtension') == 'pmd'
assert firstWord('PMDExtension') == 'p'
assert firstWord('Pmd') == 'pmd'
assert firstWord('CodeQualityExtension') == 'code'
于 2016-08-26T13:50:05.557 に答える