首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >忽略R正则表达式中的最后"/“

问忽略R正则表达式中的最后"/“
EN

Stack Overflow用户
提问于 2019-11-12 16:43:50
回答 4查看 135关注 0票数 0

给定字符串"http://compras.dados.gov.br/materiais/v1/materiais.html?pdm=08275/",我需要生成一个regex过滤器,这样如果它是"/“,它就会忽略最后一个字符。

我尝试了下面的regex "(http:////)?compras\\.dados\\.gov\\.br.*\\?.*(?<!//)"作为regexr.com/4om61,但是当我在R中运行时,它不起作用:

代码语言:javascript
复制
regex_exp_R   <- "(http:////)?compras\\.dados\\.gov\\.br.*\\?.*(?<!//)"
grep(regex_exp_R, "http://compras.dados.gov.br/materiais/v1/materiais.html?pdm=08275/", perl = T, value = T)

我需要它在纯正则表达式和grep函数中工作,而不使用任何字符串R包。谢谢。

简化案例:在你们大家的重要贡献之后,还有最后一个问题。因为我将使用regex作为另一个连接的输入,所以解决方案必须使用纯regex和grep。

剩下的一点是非常基本的:给定字符串"a1bc/“或"a1bc",regex必须返回"a1bc”。在收到的建议的基础上,我尝试了

grep(".*[^//]" ,"a1bc/", perl = T, value = T),但仍然得到"a1bc/“而不是"a1bc”。有什么暗示吗?谢谢。

EN

回答 4

Stack Overflow用户

发布于 2019-11-12 17:06:43

如果您想在不使用最后一个/的情况下返回字符串,可以使用几种方法。下面是使用基本R的几个选项:

在gsub()中使用反向引用(sub()在这里也适用):

代码语言:javascript
复制
gsub("(.*?)/*$", "\\1", x)
[1] "http://compras.dados.gov.br/materiais/v1/materiais.html?pdm=08275"

# or, adapting your original pattern
gsub("((http:////)?compras\\.dados\\.gov\\.br.*\\?.*?)/*$", "\\1", x)
[1] "http://compras.dados.gov.br/materiais/v1/materiais.html?pdm=08275"

按位置使用ifelse()和substr() (如果缩放重要的话,速度会更快一些)

代码语言:javascript
复制
ifelse(substr(x, nchar(x), nchar(x)) == "/", substr(x, 1, nchar(x)-1), x)
[1] "http://compras.dados.gov.br/materiais/v1/materiais.html?pdm=08275"

数据

代码语言:javascript
复制
x <- "http://compras.dados.gov.br/materiais/v1/materiais.html?pdm=08275/"
票数 0
EN

Stack Overflow用户

发布于 2019-12-07 09:15:55

使用sub删除尾随的/

代码语言:javascript
复制
x <- c("a1bc/", "a2bc")
sub("/$", "", x)

这对不以/结尾的字符串没有任何改变。

正如其他人所指出的,grep不修改字符串。它返回匹配字符串的索引的数字向量或(未经修改的)匹配项的向量。它通常用于对字符向量进行子集。

票数 0
EN

Stack Overflow用户

发布于 2019-12-07 10:07:01

您可以在结尾处使用负面的回顾,以确保它不会以您不想要的字符(在本例中为/)结束。这样,准则将是:

代码语言:javascript
复制
.+(?<!\/)

您可以在这里使用三个输入示例查看它:https://regex101.com/r/XB9f7K/1/。如果您只希望它与url匹配,那么您将在开始时将.+部件更改为url。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58823101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档