Сохранение имени Дело с апострофами и именами с несколькими заглавными буквами (например, McDonalds) - PullRequest
1 голос
/ 22 мая 2019

У меня есть список имен (как первых, так и последних), и я хочу стандартизировать их соглашения об именах, чтобы их было легче удалить из большей строки позже.

`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". Третий случай имеет дело с именами без дефисов, начинающимися с прописной буквы и остальными; четвертое исключение - для граничных символов, таких как hypens.

Результаты:

> 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"

Есть ли правило, которое я могу использовать, чтобы захватить Ашеннаро и сохранить заглавную букву после апострофа? Я попытался добавить ['] к моему граничному условию, но оно бросает гаечный ключ в регулярном выражении.

Кроме того, я не могу расстроить свой ум относительно того, как определить правило, чтобы Макдональдс оставался Макдональдсом, даже когда все символы написаны заглавными буквами.

Как мне решить эту проблему?

...