我正在尝试构建匹配URL
中任何协议的正则表达式(?:https?|ftp|\w{2,7})://
但我希望如果' http',' https',' ftp'现在,它将采取它们,而不是最长的匹配,如:
"hdhttp://"
我使用re2,所以我无法向前看或向后看
答案 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