В случае, если можно найти 1 ASCII, вы можете использовать table
.
tt <- table(factor(strsplit(paste(input_string, collapse = ""), "")[[1]]
, rawToChar(as.raw(32:126), TRUE)))
names(tt)[tt==0]
rawToChar(as.raw(32:126), TRUE)
дает вам все ASCII, которые используются в качестве уровней факторов. И table
считает все случаи. Если есть хотя бы один 0
, вы можете использовать его.
Если вам нужно 2 ASCII, вы можете попробовать следующее, возвращая все возможные разделители:
x <- rawToChar(as.raw(32:126), TRUE)
x <- c(outer(x, x, paste0))
x[!sapply(x, function(y) {any(grepl(y, input_string, fixed=TRUE))})]
Или для n-ASCII:
orig_sep <- x <- rawToChar(as.raw(32:126), TRUE)
sep <- x[0]
repeat {
sep <- x[!sapply(x, function(y) {any(grepl(y, input_string, fixed=TRUE))})]
if(length(sep) > 0) break;
x <- c(outer(x, orig_sep, paste0))
}
sep
Поиск 1-2 ASCII только с sapply
-циклом и с разделителем минимальной длины.
x <- rawToChar(as.raw(32:126), TRUE)
x <- c(x, outer(x, x, paste0))
x[!sapply(x, function(y) {any(grepl(y, input_string, fixed=TRUE))})][1]
#[1] " "
Если вы хотите узнать, сколько разсимвол должен быть повторен, чтобы работать в качестве разделителя, так как вы делаете это в вопросе, вы можете использовать gregexpr
.
strrep("/", max(sapply(gregexpr("/*", input_string)
, function(x) max(attributes(x)$match.length)))+1)
#[1] "///"
strrep("/", max(c(0, sapply(gregexpr("/+", input_string)
, function(x) max(attributes(x)$match.length))))+1)
#[1] "///"