保留带有撇号和大写字母的名字的大小写(例如麦当劳)

时间:2019-05-22 17:30:04

标签: r regex string naming-conventions

我有一个名称列表(名字或姓氏),并希望标准化它们的命名约定,以使它们以后更容易从较大的字符串中删除。

`names = c("A'Shennaro","De'Quattro","alison","McDonalds","Sylvester","Pj", "CJ", "MCDONALDS")`

我已经拼凑了一个函数(在Stack的大量帮助下),可以处理很多这样的情况,包括对首字母的特殊处理,例如PJ,CJ,以及带连字符的名称,例如Handel-Valdez等,但是它与撇号和麦当劳之类的名字都挣扎。

proper=function(x){
  case_when(
    nchar(x) == 2  & x == toupper(x) ~ x,
    nchar(x) == 2 & x != toupper(x) ~ toupper(x),
    nchar(x) != 2 & !grepl("-", x) ~ paste0(toupper(substr(x, 1, 1)), tolower(substring(x, 2))),
    nchar(x) != 2 & grepl("-", x) ~ gsub("\\b(\\w)", "\\U\\1", x, perl = TRUE)
  )}

第一部分将其保留,因此,如果仅两个字符且都大写(“ CJ”),则第二部分处理类似“ Cj”的情况。第三种情况涉及非带连字符的名称,将第一个字符大写,其余部分用小写大写。第四个例外是边界字符,例如连字符。

结果是:

> proper("Cj")
[1] "CJ"
> proper("Al'Shennaro")
[1] "Al'shennaro"
> proper("Handel-Valdez")
[1] "Handel-Valdez"
> proper("alison")
[1] "Alison"
> proper("McDonalds")
[1] "Mcdonalds"
> proper("Sylvester")
[1] "Sylvester"
> proper("PJ")
[1] "PJ"
> proper("MCDONALDS")
[1] "Mcdonalds"

是否存在可以用来捕获Al'Shennaro并保留撇号后大写字母的规则?我尝试将[']添加到边界条件中,但会在正则表达式中产生扳手。

而且,即使所有字符都大写,我也似乎也没能为如何定义规则使麦当劳成为麦当劳而绞尽脑汁。

我该如何解决这个问题?

0 个答案:

没有答案