3

我正在尝试制作一个正则表达式来检查某些文本是否仅包含 url 和空格,而没有其他内容:

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

会匹配,但是:

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

不匹配。

这可能吗?

4

5 回答 5

1

您可以使用此正则表达式(仅测试是否在以 http:// 开头的空格之间):

/^(?:https?:\/\/\S++\s*+)++$/ =~ text
于 2013-04-27T01:00:50.630 回答
1

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 仅包含 URL
http://www.google.com 和 http://www.stackoverflow.com 不仅包含 URL

这不支持所有公认的 URL 方案,但它是一个起点。您可以通过将一组方案传递给extract. 您可以使用以下方式获取 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]
于 2013-04-27T04:52:31.960 回答
0
words.split.all? { |word| word.match(/^http:/) }
于 2013-04-27T00:41:09.190 回答
0

这将检查任何 URL,并且字符串应该是具有单个空格作为 URL 分隔符的 URL

看看这个现场演示

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

参考:

http://www.regular-expressions.info/reference.html

http://regexlib.com/Search.aspx?k=URL&AspxAutoDetectCookieSupport=1

于 2013-04-27T00:57:19.767 回答
0

如果你真的想使用正则表达式,请试试这个:

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

请删除“协议”和“域”之前的空格。

用空格分割字符串,并检查每个字符串是否与上面的正则表达式匹配。

希望能帮助到你!

于 2013-04-27T00:59:59.763 回答