正则表达式删除模式的前缀(R)

时间:2017-08-15 09:21:47

标签: java r regex

我有两个字符串ST。如何使用正则表达式从T末尾删除S前缀的副本?

更具体地说,S由一些字符组成,后跟T的一些副本,其中最后一个可能被截断。例如,假设TabcdefSasdjb|ak.fvajfabcdefabcdefabcdefabc - 那么我想要的是asdjb|ak.fvajf

此外,ST可能包含对正则表达式引擎具有特殊含义的字符,例如.[]*+()\。我在R工作,但Java解决方案也没关系。

2 个答案:

答案 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));

demo

  

输出:asdjb | ak.fvajf