提取多个字符串的相同开头部分
extract the identical beginning parts of multiple strings
我有多个这样的字符串(所谓的 DOI):
doi1 <- "10.1057/bp.2009.9"
doi2 <- "10.1057/bp.2015.4"
doi3 <- "10.1057/bp.2008.12"
如何最好地提取字符串的共同开头?
正确的输出应该是10.1057/bp.20
.
(我的第一个猜测是使用 identical()
,但该函数只能比较 两个完整的 字符串)
包‘Biobase’ has this implemented as lcPrefix
.
但是自己实现这个并不难;这是另一个快速而肮脏的版本(小心,这只在少数情况下进行了测试):
find_longest_prefix = function (strings) {
stopifnot(is.character(strings) && length(strings) > 0L)
for (len in seq_len(nchar(strings[1L]))) {
prefixes = substr(strings, 1L, len)
if (! Reduce(\(prev, p) prev && p == prefixes[1L], prefixes[-1L], TRUE)) {
len = len - 1L
break
}
}
substr(strings[1L], 1L, len)
}
我有多个这样的字符串(所谓的 DOI):
doi1 <- "10.1057/bp.2009.9"
doi2 <- "10.1057/bp.2015.4"
doi3 <- "10.1057/bp.2008.12"
如何最好地提取字符串的共同开头?
正确的输出应该是10.1057/bp.20
.
(我的第一个猜测是使用 identical()
,但该函数只能比较 两个完整的 字符串)
包‘Biobase’ has this implemented as lcPrefix
.
但是自己实现这个并不难;这是另一个快速而肮脏的版本(小心,这只在少数情况下进行了测试):
find_longest_prefix = function (strings) {
stopifnot(is.character(strings) && length(strings) > 0L)
for (len in seq_len(nchar(strings[1L]))) {
prefixes = substr(strings, 1L, len)
if (! Reduce(\(prev, p) prev && p == prefixes[1L], prefixes[-1L], TRUE)) {
len = len - 1L
break
}
}
substr(strings[1L], 1L, len)
}