我有一个字符串向量,里面的字符串都是小写的。我想将它们转换为标题大小写,也就是每个单词的首字母都大写。我已经用双重循环实现了这个功能,但我希望有一种更有效和优雅的方法,也许可以用 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
显示捕获了每个字符串中的正确位置,但是替换字符串明显没有按预期工作。
如果您还没有意识到,我对正则表达式相对较新,并希望得到有关如何使替换正确工作的帮助。我也想学习如何设置正则表达式以避免在撇号后捕获字母,因为我不希望更改这些字母的大小写。
\\E
就没有意义了。 - green diod