Вот мое собственное решение. Регулярное выражение действительно громоздко, но оно работает - не только для небольшого образца в вопросе, но и для больших реальных рукописей.
ШАГ 1 : загрузить рукопись и вставить ее в один строка символов:
ms <- paste0(ms, collapse = " ")
ШАГ 2 : определить шаблоны для типов ссылок:
Шаблон 1 : сопоставить цитаты, полностью заключенные в скобки, например, "(Kok 2017 et c.)":
p_1 <- "\\((Mc|O’)?[A-Za-zé][^)]*\\d{4}\\)"
Pattern 2 : совпадение цитат, где только год et c. заключен в круглые скобки, например, "Kok (2017 et c.)":
p_2 <- "(Mc|O’)?[A-Z][a-zé]+\\b\\s\\(\\d{4}(: \\d+)?\\)"
Шаблон 3 : сопоставить цитаты, где за именем следует знак перед скобками, например, "Kok et al. (2017: 1-12)":
p_3 <- "(Mc|O’)?[A-Z][a-zé]+(\\set al\\.)?(’s)?\\s\\(\\d{4}(: \\d+)?\\)"
Шаблон 4 : сопоставить цитаты с двумя именами перед круглыми скобками, например, "Kok & Kik's (2017) : 1-12) ":
p_4 <- "(Mc|O’)?[A-Z][a-zé]+\\b\\s&\\s(Mc|O’)?[A-Z][a-zé]+\\b(’s)?\\s\\(\\d{4}(: \\d+)?\\)"
Шаблон 5 : сопоставить цитаты с двумя именами, заключенными в скобки, например," (Kok & Kik 2017: 1-12) ":
p_5 <- "\\((Mc|O’)?[A-Z][a-zé]+\\b\\s&\\s(Mc|O’)?[A-Z][a-zé]+\\b\\s\\d{4}(: \\d+)?\\)"
Шаблон 6 : сопоставить цитаты, заключенные в круглые скобки и начинающиеся с содержимого, например, "(например, Kok & Kik 2017: 1-12)":
p_6 <- "\\((cf\\.\\s|e\\.g\\.,\\s)?(Mc|O’)?[A-Z][a-zé]+(\\set al\\.)?\\s\\d{4}(: \\d+)?\\)"
Образец 7 : сопоставить множественные цитаты в скобках "(ср. Kik & Kok's 2018; Pit 2008; 23; Джо 2017)":
p_7 <- "\\((cf\\.|e\\.g\\.,\\s)?(Mc|O’)?[A-Z][a-z][^)]*\\d{4}(: \\d+)?;(\\scf\\. also)?\\s(Mc|O’)?[A-Z][a-z][^)]*\\d{4}(: \\d+)?\\)"
Образец 8 : сопоставлять цитаты в квадратных скобках, например, "(но см. Kik & Kok's [2018]; см. Также [Pet 2008: 23])":
p_8 <- "(Mc|O’)?[A-Z][a-zé]+\\b\\s&\\s(Mc|O’)?[A-Z][a-zé]+\\b(’s)?\\s\\[\\d{4}(: \\d+)?\\]|\\[(Mc|O’)?[A-Z][a-zé]+\\b\\s\\d{4}(: \\d+)?\\]"
STEP 3 : объединить шаблоны и применить их к рукописи:
Объединить:
allpatterns <- paste(c(p_1,p_2,p_3,p_4,p_5,p_6,p_7, p_8), collapse="|")
Извлечь с помощью * 105 9 *:
str_extract_all(ms, allpatterns)
ШАГ 4 : результат постобработки
Сохранить:
cit <- str_extract_all(ms, allpatterns)
Разделить несколько цитат, например, " (A 2000; B 1999; ...) ":
cit_split <- unlist(str_split(unlist(cit), ";\\s"))
Очистить:
cit_clean <- gsub("\\(|\\)|\\[|\\]|:\\s\\d+(-\\d+)?|(e\\.g\\.,|see also|cf.(\\salso)?)\\s|'s|’s|;", "", cit_split)
Упорядочить уникальные цитаты в алфавитном порядке:
cit_unique <- sort(unique(cit_clean))
Вот и все . Теперь у вас должен быть упорядоченный список всех ссылок в рукописи!
Отказ от ответственности : Шаблоны, определенные выше, охватывают многие форматы цитирования, но не все! Не стесняйтесь адаптировать код к своему нужды и непредвиденные обстоятельства.