common_start<-function(x, y) {
i <- 1
last <- NA
while (i <= nchar(x) & i <= nchar(x)) {
if (substr(x,i,i) == substr(y,i,i)) {
if (grepl("[[:space:][:punct:]]", substr(x,i,i), perl=T)) {
last <- i
}
} else {
break;
}
i <- i + 1
}
if (!is.na(last)) {
substr(x, 1, last-1)
} else {
NA
}
}
x <- "Here is a test of words and stuff."
y <- "Here is a better test of words and stuff."
z <- "This string doesn't match"
library(purrr)
check_str <- function(inp, pat, delimiter = "\\s") {
inp <- unlist(strsplit(inp, delimiter))
pat <- unlist(strsplit(pat, delimiter))
ln_diff <- length(inp) - length(pat)
if (ln_diff < 0) {
inp <- append(inp, rep("", abs(ln_diff)))
}
if (ln_diff > 0) {
pat <- append(pat, rep("", abs(ln_diff)))
}
idx <- map2_lgl(inp, pat, ~ identical(.x, .y))
rle_idx <- rle(idx)
if (rle_idx$values[1]) {
idx2 <- seq_len(rle_idx$length[1])
} else {
idx2 <- 0
}
paste0(inp[idx2], collapse = delimiter)
}
check_str(x, y, " ")
#> [1] "Here is a"
check_str(x, z, " ")
#> [1] ""
4条答案
按热度按时间tvz2xvvm1#
拆分字符串,计算两个拆分的最小长度,从每个拆分的开头取相应的单词数,并附加FALSE以确保在匹配相应的单词时可能出现不匹配,然后使用which.min查找第一个不匹配的单词,并将该数字减去1,然后粘贴在一起。
70gysomp2#
您可以编写一个helper函数来为您执行检查
用它来搅拌样品
其思想是检查每一个字符,跟踪最后一个仍然匹配的非单词字符。使用while循环可能并不花哨,但它确实意味着一旦发现不匹配,你可以提前中断,而不必处理整个字符串。
cnjp1d6j3#
这将显示匹配的前
n
个单词:从这里,我们可以很容易地推导出前导字符串:
剩下的字符串
jmo0nnb34#
我写了一个函数来检查字符串并返回所需的输出:
创建于2023年2月13日,使用reprex v2.0.2