从或正则表达集团获得第一场比赛

时间:2017-02-14 23:03:54

标签: c# re2

我正在尝试构建匹配URL

中任何协议的正则表达式
(?:https?|ftp|\w{2,7})://

但我希望如果' http',' https',' ftp'现在,它将采取它们,而不是最长的匹配,如:

"hdhttp://"

我使用re2,所以我无法向前看或向后看

1 个答案:

答案 0 :(得分:2)

RE2特定答案

由于在RE2中你不能使用外观,你必须拆分模式并使用两个。一个是require(dplyr) df<-data.frame(row=LETTERS[1:4], V1=rep(1,4), V2=rep(2,4), V3=c("NA","3","NA","3"), V4=c("3","4","3","4"), V5=c("4","5","4","5"), V6=c("5","NA","5","NA")) df # Identify rows to shift shift_rows <- which(with( df, df$V3=="NA")) #Extract and shift the identified rows dfshifted<- df %>% "["(.,shift_rows,) %>% mutate(V3=V4,V4=V5,V5=V6) # Extract rows requiring no shifting dfunshifted<- df[-shift_rows,] # Bind them df<-rbind(dfshifted,dfunshifted,make.row.names = F) # Order the rows df<- df[order(df$row),] df$V6<- NULL df ,如果找不到匹配,请使用(https?|ftp)://。或者,使用正则表达式然后检查匹配是否包含\w{2,7}://http://https://,如果是,并且匹配值的长度大于这些字符串,则需要使用这些价值而不是匹配。

与.NET相关的答案

您可以使用否定前瞻来限制更通用的替代方案:

ftp://

请参阅regex demo

(?:https?|ftp|(?!\w*(?:https?|ftp):)\w{2,7}):// ^^^^^^^^^^^^^^^^^^^^^^ 否定前瞻将使匹配失败,如果(?!\w*(?:https?|ftp):)匹配2到7个字符字符的子字符串,并以\w{2,7}http或{{1结尾在https之前添加更多内容(如果需要)。

在.NET中,你也可以使用负面的lookbehind(它支持那里的未知宽度模式):

ftp

查看.NET regex demo