我有一个格式为http://www.abc.com/zyx/yxc/asd/?asd的字符串
我想编写一个正则表达式,它只读取http://www.abc.com/ 作为前 19 个字符。如果搜索字符串不在此位置,则不应匹配。
我可以使用正则表达式搜索字符串,^[http://www.abc.com]$
但我也想指定位置
我有一个格式为http://www.abc.com/zyx/yxc/asd/?asd的字符串
我想编写一个正则表达式,它只读取http://www.abc.com/ 作为前 19 个字符。如果搜索字符串不在此位置,则不应匹配。
我可以使用正则表达式搜索字符串,^[http://www.abc.com]$
但我也想指定位置
如果您必须检查字符串是否完全以开头'http://www.abc.com/'
,您可以使用start_with? 方法如下:
str.start_with? 'http://www.abc.com/' # => true
请注意,如果您无论如何都想查看特定位置的子字符串,您可以使用 [] 运算符通过传递范围而不是数字来获取它:
str[0..18] # => 'http://www.abc.com/'
然后,您可以将您希望的任何正则表达式应用于以下结果str[0..18]
:
str[0..18] =~ /some [hard] regex/
但是,如果您想检查是否完全匹配,第一个示例start_with?
似乎更加优雅,因为它不包含任何硬编码数字并且不需要正则表达式。
附言 奖励:令我惊讶的是,[ ] 运算符(它是slice
方法的同义词)不仅可以获取数字和数字范围,还可以获取字符串部分和正则表达式。所以你甚至可以这样做str[0..18][/some [hard] regex/]
,它会返回匹配的部分或nil
使用 URL 的正确方法是使用 URL 解析器。Ruby 的内置URI将完成这项工作:
require 'uri'
uri = URI.parse('http://www.abc.com/zyx/yxc/asd/?asd')
uri.scheme # => "http"
uri.host # => "www.abc.com"
uri.path # => "/zyx/yxc/asd/"
uri.query # => "asd"
'%s://%s' % [uri.scheme, uri.host] # => "http://www.abc.com"
请注意,path
包含前导/
,因此正确的主机 URL 不包含/
. 如果你愿意,你可以很容易地添加它。
现在,让我们看一下您尝试使用的正则表达式模式:
^[http://www.abc.com]$
这说:
^
"h", "t", "p", ":", "/", "w", ".", "a", "b", "c", "o", "m"
$
换句话说,它正在寻找一行中的单个字符。