我正在尝试制作一个正则表达式来检查某些文本是否仅包含 url 和空格,而没有其他内容:
http://www.google.com http://www.stackoverflow.com
会匹配,但是:
http://www.google.com and http://www.stackoverflow.com
不匹配。
这可能吗?
您可以使用此正则表达式(仅测试是否在以 http:// 开头的空格之间):
/^(?:https?:\/\/\S++\s*+)++$/ =~ text
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]
words.split.all? { |word| word.match(/^http:/) }
这将检查任何 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
如果你真的想使用正则表达式,请试试这个:
(?< protocol>\w+):\/\/(?< domain>[\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*
请删除“协议”和“域”之前的空格。
用空格分割字符串,并检查每个字符串是否与上面的正则表达式匹配。
希望能帮助到你!