ruby 什么是正则表达式来检查某些文本是否只包含URL?

g9icjywg  于 2023-05-06  发布在  Ruby
关注(0)|答案(5)|浏览(131)

我正在尝试创建一个正则表达式,用于检查某些文本是否只包含url和空格,而不包含其他内容:

http://www.google.com http://www.stackoverflow.com

匹配,但是:

http://www.google.com and http://www.stackoverflow.com

不会匹配。
这可能吗?

0kjbasz6

0kjbasz61#

你可以使用这个正则表达式(只测试是否在http://开始的空格之间):

/^(?:https?:\/\/\S++\s*+)++$/ =~ text
cigdeys3

cigdeys32#

Ruby已经有了一个提取URL的方法,所以这是一个很好的起点,而不是重新发明一个工作轮:

require 'uri'

[
  'http://www.google.com http://www.stackoverflow.com',
  'http://www.google.com and http://www.stackoverflow.com'
].each do |url|
  print url
  if url.split.all? { |u| !URI.extract(u).empty? }
    puts " contains only URLs"
  else
    puts " doesn't contain only URLs"
  end
end

在运行之后,它是:

http://www.google.com http://www.stackoverflow.com contains only URLs
http://www.google.com and http://www.stackoverflow.com doesn't contain only URLs

这并不支持所有的the recognized URL schemes,但它是一个起点。您可以通过向extract传递一个scheme数组来指定所需的scheme。您可以使用以下命令获取IANA的永久列表:

require 'open-uri'
require 'nokogiri'

doc = Nokogiri::HTML(open('http://www.iana.org/assignments/uri-schemes.html'))
schemes = doc.at('table table').search('tr').map{ |tr| tr.at('td').text }[1..-1]
xv8emn3q

xv8emn3q3#

words.split.all? { |word| word.match(/^http:/) }
ijxebb2r

ijxebb2r4#

如果你真的想使用正则表达式,请尝试以下操作:

(?< protocol>\w+):\/\/(?< domain>[\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*

请删除“protocol”和“domain”前面的空格。
用空格分割字符串,并检查每个字符串是否与上面的正则表达式匹配。
希望有帮助!

i1icjdpr

i1icjdpr5#

这将检查任何URL和字符串应该是URL与单一的空格作为URL分隔符只
看看这个live demo

(((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)\s){1,}((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)$

参考:

相关问题