我有两个字符串S
和T
。如何使用正则表达式从T
末尾删除S
前缀的副本?
更具体地说,S
由一些字符组成,后跟T
的一些副本,其中最后一个可能被截断。例如,假设T
是abcdef
而S
是asdjb|ak.fvajfabcdefabcdefabcdefabc
- 那么我想要的是asdjb|ak.fvajf
。
此外,S
和T
可能包含对正则表达式引擎具有特殊含义的字符,例如.[]*+()\
。我在R工作,但Java解决方案也没关系。
答案 0 :(得分:1)
我相信这样做。但它真的很长。
S <- "asdjb|ak.fvajfabcdefabcdefabcdefabc"
T <- "abcdef"
want <- "asdjb|ak.fvajf"
sp <- strsplit(T, "")[[1]]
pat <- sapply(seq_along(sp), function(i){
paste(sp[seq_len(i)], collapse = "")
})
pat <- paste0("(", paste(pat, collapse = "|"), ")*$")
result <- gsub(pat, "", S)
identical(result, want)
[1] TRUE
如果要处理多个向量,请将上述内容重写为函数,然后使用sapply
。 (或lapply
。)
repl <- function(x, prefix){
sp <- strsplit(prefix, "")[[1]]
pat <- sapply(seq_along(sp), function(i){
paste(sp[seq_len(i)], collapse = "")
})
pat <- paste0("(", paste(pat, collapse = "|"), ")*$")
result <- gsub(pat, "", x)
result
}
where <- rep(S, 10)
pref <- rep(T, 10)
sapply(seq_along(where), function(i) repl(where[[i]], pref[[i]]))
答案 1 :(得分:0)
我想你想做这样的事情
final String regex = "a(b|(bc|(bcd|(bcde|bcdef))))?$";
String string = "asdjb|ak.fvajfabcdefabcdefabcdefabc";
final Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);
int length = 0;
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
length += matcher.group(0).length();
matcher = pattern.matcher(string.substring(0, string.length()- length));
}
System.out.println(string.substring(0, string.length()- length));
输出:asdjb | ak.fvajf