Regex 不带全局标志的Ruby正则表达式
我有一个正则表达式问题。我有一个正则表达式:Regex 不带全局标志的Ruby正则表达式,regex,ruby,Regex,Ruby,我有一个正则表达式问题。我有一个正则表达式: /(https|http):\/\/(kwagmire)\.(com)\/(embed)\/([a-zA-Z0-9]+)/i 这可以在RubyonRails上正确地捕获任何具有 http://kwagmire.com/embed/1QgJVmCam 返回一个真实的值,我想是因为它使用了我不想要的global标志来设置它 我尝试了match和scan,但如果看到链接,仍然会返回真实值。我只想说得具体一点 https://kwagmire.com/e
/(https|http):\/\/(kwagmire)\.(com)\/(embed)\/([a-zA-Z0-9]+)/i
这可以在RubyonRails上正确地捕获任何具有
http://kwagmire.com/embed/1QgJVmCam
返回一个真实的值,我想是因为它使用了我不想要的global
标志来设置它
我尝试了match
和scan
,但如果看到链接,仍然会返回真实值。我只想说得具体一点
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
返回,但这应该失败
#<MatchData "http://jsitor.com/embed/1QgJVmCam" 1:"http" 2:"jsitor" 3:"com" 4:"embed" 5:"1QgJVmCam">
#
我想
(?im)^https?:\/\/(?:w{3})?kwagmire\.com\/embed\/([a-zA-Z0-9]+)\/?$
可能就行了
试验
输出
正则表达式电路
可视化正则表达式:
如果您希望简化/修改/探索表达式,将在的右上面板中进行解释。如果您愿意,还可以在中查看它与一些示例输入的匹配情况
看起来您只需要在正则表达式的开始和结束处使用
^
和$
,或者更好的是使用\A
和\Z
标记整个字符串的开始和结束(^
和$
只要是一行)
这告诉Ruby它必须从头到尾匹配。此外,结尾的“i”不是必需的,可能会产生错误的结果
下面修改的正则表达式将起作用
/\A(https | http):\/\/(kwagmire)\.(com)\/(嵌入)\/([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(警报('asdfadsf')))
返回nil
myregex.match(“http://kwagmire.com/embed/1QgJVmCam/")
返回#
有些人在遇到问题时会想:“我知道,我会用
现在他们有两个问题
Ruby具有实际解析URI并理解它们的功能。当涉及到实际使用URI时,它将击败几乎所有正则表达式
输入:
input = ["https://kwagmire.com/embed/1QgJVmCam", "http://kwagmire.com/embed/1QgJVmCam", "https.evil.com/http://jsitor.com/embed/1QgJVmCam", "facebook.com", "https://google.com", "www.twitter.com", "http://kwagmire.com/embed/1QgJVmCam/?onload(alert('asdfadsf'))", "http://kwagmire.com/embed/1QgJVmCam/ onload(alert('asdfadsf'))"]
输出:
["https://kwagmire.com/embed/1QgJVmCam", "http://kwagmire.com/embed/1QgJVmCam"]
这让您可以使用一个简单得多的正则表达式来验证路径,您也可以使用
uri.path.split('/')
完全放弃正则表达式。它还保证您处理的是一个有效的URI。您能更具体地说明您想要实现什么吗?你能提供一些你想要匹配的和不应该匹配的测试链接吗?@allenbrkn在之前检查文本,这不是关于Rails的问题。这是一个关于纯Ruby的问题。与其尝试编写一个正则表达式(因为URI很复杂),不如使用Ruby的URI类,该类已经编写好并且可以工作,它允许您将一条路径分解为其组件,然后单独检查它们。特别是,查看和。您需要根据您想要实现的目标来陈述您的问题,而不需要引用正则表达式。也就是说,您有许多要测试的字符串。只有一个通过了测试。测试是什么?这就是你需要提出问题的方式。完成后,您可以展示您尝试过的正则表达式,并解释为什么它不起作用。最后,忘记猜测为什么正则表达式不起作用了。对不起,先生,这不起作用。我想的是likeregex\u而不需要全局.match('https://kwagmire.com/embed/1QgJVmCam“)
return truthyregex\u,不带全局匹配('https://kwagmire.com/embed/1QgJVmCam/?evilevil“)
使用ruby返回nil,^
和$
始终匹配行的开头和结尾,m修饰符允许点匹配新行。@casimimirithippolyte但当我尝试他的方法时,它只给了我一个空数组,先生,我想这就是了。这就是我想要的。我知道有一种简单的方法不需要循环,因为我知道url是什么。在我忘记之前,我在javascript中使用了类似的方法。谢谢大家!@randallalso我添加了这个\A和\Z,但它说的是文字A,这就是为什么我没有使用它。
["1QgJVmCam"]
["1QgJVmCam"]
input = ["https://kwagmire.com/embed/1QgJVmCam", "http://kwagmire.com/embed/1QgJVmCam", "https.evil.com/http://jsitor.com/embed/1QgJVmCam", "facebook.com", "https://google.com", "www.twitter.com", "http://kwagmire.com/embed/1QgJVmCam/?onload(alert('asdfadsf'))", "http://kwagmire.com/embed/1QgJVmCam/ onload(alert('asdfadsf'))"]
require 'uri'
# This assumes that the id is 9 characters
re = /\A\/embed\/[\d|a-zA-Z]{9}\/?\Z/.freeze
clean = input.map do |line|
begin
uri = URI(line)
if uri.host == 'kwagmire.com' && uri.path =~ re && !uri.query
uri.to_s
end
rescue URI::InvalidURIError
nil
end
end.compact
["https://kwagmire.com/embed/1QgJVmCam", "http://kwagmire.com/embed/1QgJVmCam"]