如何在保持首字母大写的同时仅将每个单词的首字母大写?

How to capitalize only the first letter of each word while keeping acronyms capitalized?

我正在编写一个函数来自动清理变量名以生成同质变量名。通常将 'This is anExample' 之类的内容转换为 'This.Is.An.Example'。通常所有这些都很容易,但是我在处理变量名称中包含的首字母缩略词时遇到了麻烦。

例如:"Clock in Time PST" 理想情况下会变成 "Clock.In.Time.PST"

我研究过将 str_to_upper 作为一个函数进行修改,但我对 C 语言没有任何应用知识,这似乎是编写 stringi 的背景。

我唯一的下一个想法是做一些有条件的检查,如果字符串没有 spaces 或标点符号,然后在大写字母前插入 space,因为前一个字母是小写字母。那是我唯一真正的想法如何潜在地处理它。

Example<-c("Easy Example Test", 
           "Medium..example TEst", 
           "HaRd exampleTEST", 
           "Truly HARd TestCase  PST")


#Step 1 - Removes all punctuation replacing with spaces
Example<-stringr::str_replace_all(Example, "[[:punct:]]", " ")

#Step 2 - This inserts a space wherever an uppercase letter is found with a preceding lowercase letter.
Example<-stringr::str_replace_all(Example,
 "([[:lower:]](?=[[:upper:]])|[[:upper:]](?=[[:upper:]][[:lower:]]))",
              "\1 ")

#Step 3 - This replaces all consecutive spaces with a period
Example<-stringr::str_replace_all(names(df), "\s{1,}", ".")





Current.Outcome<-c("Easy.Example.Test", 
                   "Medium.example.T.Est", 
                   "Ha.Rd.example.TEST", 
                   "Truly.HA.Rd.Test.Case.PST")


Ideal.Outcome<-c("Easy.Example.Test",
                 "Medium.Example.Test", 
                 "Hard.Example.Test", 
                 "Truly.Hard.Test.Case.PST")

我花了一段时间找出最好的一般规则,使用正则表达式规则和字符串替换来解决这个问题。该解决方案不是很漂亮,但它在大多数情况下都有效,而且更准确的答案不会像我需要的那样笼统。下面是我的工作答案的另一个例子。

我尝试将正则表达式拆分为三个单独的 str_replace_all() 命令,但结果并不乐观,因此我们有这个庞大的正则表达式来执行所需的分组和匹配。

Example<-c("Easy Example Test", 
           "Medium..example TEst", 
           "Hard exampleTEST", 
           "Truly HARd TestCase  PST",
           "AnotherTESTof5FT2In",
           "AnotherTESTof5FTT2In",
           "ExampleOfCommonProblem")


  Example<-stringr::str_replace_all(Example, "[[:punct:]]", " ")

  Example<-stringr::str_replace_all(Example,
"(([[:lower:]]|[[:digit:]]){1}(?=[[:upper:]])|[[:upper:]]{2,}(?=([[:lower:]]|[[:digit:]]))|([[:lower:]]){1,}(?=[[:digit:]]))",
              "\1 ")

  Example<-stringr::str_replace_all(Example, "\s{1,}", ".")

  Example

下面是上面代码的控制台输出,它没有提供完美的答案,但解决了绝大多数测试用例。


>   Example
[1] "Easy.Example.Test"          "Medium.example.TE.st"      
[3] "Hard.example.TEST"          "Truly.HAR.d.Test.Case.PST" 
[5] "Another.TEST.of.5.FT.2.In"  "Another.TEST.of.5.FTT.2.In"
[7] "Example.Of.Common.Problem"