Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中将pcre正则表达式转换为ICU正则表达式_R_Regex_Pcre_Icu - Fatal编程技术网

在R中将pcre正则表达式转换为ICU正则表达式

在R中将pcre正则表达式转换为ICU正则表达式,r,regex,pcre,icu,R,Regex,Pcre,Icu,您好,我想咨询一下如何将PCRE正则表达式转换为ICU正则表达式,以便我可以使用R函数str_match_all(stringr包的一部分) @Wiktor Stribiżew能够生成REGEX PCRE解析,如这些REGEX101演示中所示: 此解析捕获aa和bb组合(每个组合前面都有任意长度的数字),然后捕获cc组(前面同样有数字),例如10AA5BB6BB6AA999CC998CC997CC 因此,请将字符串视为两部分: 第一个是aa或bb组合的随机集合(尽管这可能只是所有aa,例如),

您好,我想咨询一下如何将PCRE正则表达式转换为ICU正则表达式,以便我可以使用R函数str_match_all(stringr包的一部分)

@Wiktor Stribiżew能够生成REGEX PCRE解析,如这些REGEX101演示中所示:

此解析捕获aa和bb组合(每个组合前面都有任意长度的数字),然后捕获cc组(前面同样有数字),例如10AA5BB6BB6AA999CC998CC997CC

因此,请将字符串视为两部分:

第一个是aa或bb组合的随机集合(尽管这可能只是所有aa,例如),前面有一个数字

第二部分是一系列cc(尽管这可能只是一个cc,例如),前面有一个数字

重要的是,字符串的两个“边”一起捕获,并且文本和数字都被专门捕获。因此,有效的捕获是,例如:

2aa2cc
323233aa21212bb4555cc
1aa2aa3aa4aa5aa6aa117cc8cc
1bb2bb3bb4bb5bb6bb117cc8cc
1aa2bb3bb4aa5bb6bba117cc8cc
1aa2bb3bb4aa5bb6bba117cc8ccXXXXXXXXXX1aa2bb3bb4aa5bb6bba117cc8cc
无效:

2aa *Only one side of the string is there*
1aa2bb3bb4aa *Only one side of the string is there*
99cc100cc *Only one side of the string is there*
此外,对于字符串中“cc”组排在第一位的实例,我还需要一个单独的正则表达式,例如999CC998CC997CC10AA5BB6BBB3BB6AA。这在这里得到了证明:

注意:文本模式aa、bb和cc实际上是较长字符串的缩写,因此应如此处理。我提供了较短的版本,以避免出现更混乱的示例。

这两个演示显示了不同组合顺序的正则表达式

现在我必须使用str_match_all在R中运行,不幸的是,它使用的是ICU正则表达式,而不是我们在REGEX101中测试的pcre正则表达式

我有这段代码,它抛出了一个未实现的regexp特性的用法。(U_REGEX_未实现)错误:

#REGEX TEST#
library(stringr)

regex_text_1 <- "8aa9aa10bb1cc2cc3cc"
#reg_pattern_1 that worked in REGEX101 <- "(?:\G(?!^)(?(?=\d+(?:aa|bb))(?<!\dcc))|(?=(?:\d+(?:aa|bb))+(?:\d+cc)+))(\d+)(aa|bb|cc)"
reg_pattern_1 <- "(?:\\G(?!^)(?(?=\\d+(?:aa|bb))(?<!\\dcc))|(?=(?:\\d+(?:aa|bb))+(?:\\d+cc)+))(\\d+)(aa|bb|cc)"

regex_text_2 <- "1cc2cc3cc8aa9bb10bb"
#reg_pattern_2 that worked in REGEX101 <- "(?:\G(?!^)(?(?=\d+cc)(?<!\d(?:aa|bb)))|(?=(?:\d+cc)+(?:\d+(?:aa|bb))+))(\d+)(aa|bb|cc)"
reg_pattern_2 <- "(?:\\G(?!^)(?(?=\\d+cc)(?<!\\d(?:aa|bb)))|(?=(?:\\d+cc)+(?:\\d+(?:aa|bb))+))(\\d+)(aa|bb|cc)"

sm <- str_match_all(regex_text_1, reg_pattern_1)
sm.df <- as.data.frame(sm)
print(sm.df)

sm <- str_match_all(regex_text_2, reg_pattern_2)
sm.df <- as.data.frame(sm)
print(sm.df)

…就像我们在pcre中应用它一样

我没有足够的专家将代码从pcre转换到icu,因此非常感谢您的帮助。非常感谢

data.frame(do.call(rbind,regmatches(a<-strsplit(regex_text_1,'(?<=[a-z])(?=[0-9])',perl = T)[[1]],regexec('(\\d)(\\D+)',a))))
   X1 X2 X3
1 8aa  8 aa
2 9aa  9 aa
3 0bb  0 bb
4 1cc  1 cc
5 2cc  2 cc
6 3cc  3 cc
您还可以使用
gsub
并执行以下操作:

transform(read.table(text=gsub('(\\d+)(\\D+)','\\1 \\2\n',regex_text_1)),v3=paste0(V1,V2))
  V1 V2   v3
1  8 aa  8aa
2  9 aa  9aa
3 10 bb 10bb
4  1 cc  1cc
5  2 cc  2cc
6  3 cc  3cc

好吧,这不会转化为重症监护病房,但会更好。它是STR_MATCH_ALL的Perl版本。它工作得很好

感谢建造它的人。它来自这里:

####从多个字符串中的每一个解析模式的几个实例
###使用(命名)捕获正则表达式,返回
###矩阵(具有列名)。

str_match_all_perl你好。非常感谢。我对我的问题进行了编辑,以便更清楚。我只需要捕获组合同时发生的情况。因此,1CC2CC3C本身不会被拾取。8aa9aa10bb本身也不会。和1CC2CC3CCXXXXXXXXXYYYYZZ8AA9AA10BB将不起作用。您可以使用
grep
捕获指定的模式,即
^(?=.*aa)(?=.*bb)(?=.*cc)(?!.[d-z])
要确定字符串具有模式
aa
bb`cc',并且没有来自
d-z的任何其他字母
,这是否允许解析和接受1BB2AA3AA3C?此外,这些字母不是真正的数据,而是模拟数据,以使示例更简单。实际上,aa代表一个特定的字符串,大约10个字符长。嗨@onyanbu,我把事情复杂化了吗?
data.frame(do.call(rbind,regmatches(a<-strsplit(regex_text_1,'(?<=[a-z])(?=[0-9])',perl = T)[[1]],regexec('(\\d)(\\D+)',a))))
   X1 X2 X3
1 8aa  8 aa
2 9aa  9 aa
3 0bb  0 bb
4 1cc  1 cc
5 2cc  2 cc
6 3cc  3 cc
a = strsplit(regex_text_1, '(?<=[a-z])(?=[0-9])', perl = TRUE)[[1]]
b = regmatches(a, regexec('(\\d)(\\D+)', a))
data.frame(do.call(rbind, b))
   X1 X2 X3
1 8aa  8 aa
2 9aa  9 aa
3 0bb  0 bb
4 1cc  1 cc
5 2cc  2 cc
6 3cc  3 cc
 ff = function(x)data.frame(do.call(rbind,regmatches(a<-strsplit(x,'(?<=[a-z])(?=[0-9])',perl = T)[[1]],regexec('(\\d)(\\D+)',a))))

 ff(regex_text_1)
   X1 X2 X3
1 8aa  8 aa
2 9aa  9 aa
3 0bb  0 bb
4 1cc  1 cc
5 2cc  2 cc
6 3cc  3 cc
ff(regex_text_2)
   X1 X2 X3
1 1cc  1 cc
2 2cc  2 cc
3 3cc  3 cc
4 8aa  8 aa
5 9bb  9 bb
6 0bb  0 bb
transform(read.table(text=gsub('(\\d+)(\\D+)','\\1 \\2\n',regex_text_1)),v3=paste0(V1,V2))
  V1 V2   v3
1  8 aa  8aa
2  9 aa  9aa
3 10 bb 10bb
4  1 cc  1cc
5  2 cc  2cc
6  3 cc  3cc
### Parse several occurances of pattern from each of several strings
### using (named) capturing regular expressions, returning a list of
### matrices (with column names).
str_match_all_perl <- function(string,pattern){
  stopifnot(is.character(string))
  stopifnot(is.character(pattern))
  stopifnot(length(pattern)==1)
  parsed <- gregexpr(pattern,string,perl=TRUE)
  lapply(seq_along(parsed),function(i){
    r <- parsed[[i]]
    starts <- attr(r,"capture.start")
    if(r[1]==-1)return(matrix(nrow=0,ncol=1+ncol(starts)))
    names <- attr(r,"capture.names")
    lengths <- attr(r,"capture.length")
    full <- substring(string[i],r,r+attr(r,"match.length")-1)
    subs <- substring(string[i],starts,starts+lengths-1)
    m <- matrix(c(full,subs),ncol=length(names)+1)
    colnames(m) <- c("",names)
    m
  })
}