我有一個小寫字母向量。我想將它們改爲標題案例,這意味着每個單詞的第一個字母將被大寫。我設法用雙循環來做到這一點,但我希望有一個更高效和更優雅的方式來做到這一點,或許是一個gsub
和一個正則表達式。如何將字符串矢量轉換爲標題案例
下面是一些示例數據,以及工作的雙循環,其次是我嘗試過的其他操作無效。
strings = c("first phrase", "another phrase to convert",
"and here's another one", "last-one")
# For each string in the strings vector, find the position of each
# instance of a space followed by a letter
matches = gregexpr("\\b[a-z]+", strings)
# For each string in the strings vector, convert the first letter
# of each word to upper case
for (i in 1:length(strings)) {
# Extract the position of each regex match for the string in row i
# of the strings vector.
match.positions = matches[[i]][1:length(matches[[i]])]
# Convert the letter in each match position to upper case
for (j in 1:length(match.positions)) {
substr(strings[i], match.positions[j], match.positions[j]) =
toupper(substr(strings[i], match.positions[j], match.positions[j]))
}
}
這工作,但它似乎非常複雜。我只是在用更直接的方法試驗失敗後才採取了這種做法。下面是一些我嘗試過的東西,用的輸出一起:
# Google search suggested \\U might work, but evidently not in R
gsub("(\\b[a-z]+)", "\\U\\1" ,strings)
[1] "Ufirst Uphrase" "Uanother Uphrase Uto Uconvert"
[3] "Uand Uhere'Us Uanother Uone" "Ulast-Uone"
# I tried this on a lark, but to no avail
gsub("(\\b[a-z]+)", toupper("\\1"), strings)
[1] "first phrase" "another phrase to convert"
[3] "and here's another one" "last-one"
正則表達式捕獲每個字符串的正確位置,如圖通過調用gregexpr
,但可根據需要替換字符串顯然是行不通的。
如果您還不能確定,我對正則表達式相對來說比較陌生,並且希望能夠幫助您瞭解如何使替換正常工作。我還想學習如何構造正則表達式,以避免在撇號後捕獲一個字母,因爲我不想更改這些字母的大小寫。
Hi @BenBolker,你的re_from應該是''\\ b([[:alpha:]]([[:alpha]] +)「'而不是'」\\ b([[:lower:]] )([[:低:]] +)「'。否則,在最後的評論中使用'\\ E'沒有意義。 –