簡體   English   中英

PascalCase中的第一個單詞為小寫

[英]First word from PascalCase as lowercase

我有一個包含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(' ')

但它刪除了所有大寫字母,而我需要保留它們。

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

static String firstWord(String word) {
    word ? word.split(/(?=\p{Lu})/)[0].toLowerCase() : ''

    // A verbose way would be as below (omitting the null check for brevity)
    // word[0].toLowerCase() + word[1..-1].takeWhile { Character.isLowerCase(it) }
}

就像是:

static String firstWord(String word) {
    return word[0].toLowerCase()+word.split(['A'..'Z'].join('|'))[1]
}

Groovy查找運算符( =~ )似乎很好地完成了這項工作:

static String firstWord(String word) {
    word ? (word =~ /[A-Z][a-z]*/)[0].toLowerCase() : ''
}

inject方法可用於累積字符,直到遇到第二個大寫字母:

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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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