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类,该类已经编写好并且可以工作,它允许您将一条路径分解为其组件,然后单独检查它们。特别是,查看和。您需要根据您想要实现的目标来陈述您的问题,而不需要引用正则表达式。也就是说,您有许多要测试的字符串。只有一个通过了测试。测试是什么?这就是你需要提出问题的方式。完成后,您可以展示您尝试过的正则表达式,并解释为什么它不起作用。最后,忘记猜测为什么正则表达式不起作用了。对不起,先生,这不起作用。我想的是like
regex\u而不需要全局.match('https://kwagmire.com/embed/1QgJVmCam“)
return truthy
regex\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"]