gpt4 book ai didi

regex - 没有全局标志的Ruby正则表达式

转载 作者:行者123 更新时间:2023-12-04 22:53:27 25 4
gpt4 key购买 nike

我有一个正则表达式问题。我有这个正则表达式:

/(https|http):\/\/(kwagmire)\.(com)\/(embed)\/([a-zA-Z0-9]+)/i


这可以在 https://regexr.com上正确捕获,但在Ruby on Rails上可以

http://kwagmire.com/embed/1QgJVmCam


返回一个真实值,我想是因为它使用了我不需要的 global标志来设置它。

我尝试了 matchscan,但是如果看到链接,仍然会返回真实值。我只希望它具体。

https://kwagmire.com/embed/1QgJVmCam < I want to return success this one is ok when testing on console

http://kwagmire.com/embed/1QgJVmCam < I want to return success also this on returns good

https.evil.com/http://jsitor.com/embed/1QgJVmCam < I want to return fail or nil, this one passes returns all match

facebook.com < I want to return fail or nil this one is good because it's failing

https://google.com < I want to return fail or nil also this good failed
www.twitter.com < I want to return fail or nil

http://kwagmire.com/embed/1QgJVmCam/?onload(alert('asdfadsf')) < I want to return fail or nil, this one also is failing, good

http://kwagmire.com/embed/1QgJVmCam/ onload(alert('asdfadsf')) < I want to return fail or nil, this one returns match too but should fail

http://kwagmire.com/embed/1QgJVmCam/?onload(alert('asdfadsf')) < I want to return fail or nil, this one returns match too, this should fail


基本上我希望这个 https://kwagmire.com/embed/1QgJVmCam所有其他应该返回nil或false。有没有不循环的简单方法吗?我认为这方面的解决方案是删除全局标志或 g,但是您有那种选择吗?如果是这样,为什么我要这样做?

请参阅 i之后的 /

/(https|http):\/\/(jsitor)\.(com)\/(embed)\/([a-zA-Z0-9]+)/i.match("http://jsitor.com/embed/1QgJVmCam/ onload(alert('asdfadsf'))")


然后返回,但这应该失败

#<MatchData "http://jsitor.com/embed/1QgJVmCam" 1:"http" 2:"jsitor" 3:"com" 4:"embed" 5:"1QgJVmCam">

最佳答案

看起来您只需要在正则表达式的开头和结尾处加上^$,或者更好地是\A\Z来标记整个字符串的开头和结尾(^$只要它是一行就可以工作)。

这告诉Ruby,它必须从头到尾都匹配。另外,结尾处的“ i”不是必需的,并且可能会产生错误的结果。

以下修改的正则表达式将起作用。

/\A(https|http):\/\/(kwagmire)\.(com)\/(embed)\/([a-zA-Z0-9]+)\/?\Z/

请注意,除了\A\Z之外,我还添加了\/?,它允许在URL末尾添加可选的/。最后,我还删除了i,因为您实际上并不希望整个正则表达式不区分大小写。最后一部分([a-zA-Z0-9]+)对于使用a-z和A-Z进行声明的方式已经不区分大小写。

myregex.match("http://kwagmire.com/embed/1QgJVmCa/?onload(alert('asdfadsf'))")
返回nil

myregex.match("http://kwagmire.com/embed/1QgJVmCam/")
返回#<MatchData "http://kwagmire.com/embed/1QgJVmCam/" 1:"http" 2:"kwagmire" 3:"com" 4:"embed" 5:"1QgJVmCam">

关于regex - 没有全局标志的Ruby正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58576408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com