以下是我的测试用例。
预期:
JUNKINFRONThttp://francium.tech
应为http://francium.tech
JUNKINFRONThttp://francium.tech/http
应为http://francium.tech/http
francium.tech/http
应为francium.tech/http
(不受影响)
实际结果:
http://francium.tech
francium.tech/http
http
我正在尝试为此编写正则表达式替换。我试过这个,
text.sub(/.*http/,'http')
然而,我的第二和第三个测试用例都失败了,因为它搜索到最后。如果答案也可以使案例不敏感,那将会有所帮助。
2.5.0 :001 > url = 'francium.tech/http'
=> "francium.tech/http"
2.5.0 :002 > url.sub(/^.*?(?=http)/i,'')
=> "http"
答案 0 :(得分:2)
我认为这可以解决您的问题。
A Pirate's Adventure - Treasures of the Seven Seas
Captain Jack Sparrow's Pirate Tutorial
Jungle Cruise
Meet Characters from Aladdin in Adventureland
Pirates of the Caribbean
Swiss Family Treehouse
答案 1 :(得分:2)
使用正则表达式时,您应确保使用http:\\
或更好http:\\[SOMETHING].[AT_LEAST_TWO_CHARS][MAYBE_A_SLASH]
等唯一字符串等等...
这适用于您的特定情况:
str = ['JUNKINFRONThttp://francium.tech',
'JUNKINFRONThttp://francium.tech/http',
'francium.tech/http']
str.each do |str|
puts str.sub(/^.*?(https?:\/{2})/, '\1') # with capturing group
puts str.sub(/^.*?(?=https?:\/{2})/, '') # with positive lookahead
end
通过使用组我们可以用它来替换,另一种方法是使用正向前瞻
答案 2 :(得分:2)
根据我原来的评论,您可以使用如下所示的模式。如果您希望非常小的性能增益,则可以使用第二个模式删除正则表达式中的一个步骤。如果您特别关注性能,那么最后一个表现得更快。
^.*?(?=https?://)
^.*?(?=https?:/{2})
^.*?(?=ht{2}ps?:/{2})
strings = [
"JUNKINFRONThttp://francium.tech",
"JUNKINFRONThttp://francium.tech/http",
"francium.tech/http"
]
strings.each { |s| puts s.sub(%r{^.*?(?=https?://)}, '') }
输出以下内容:
http://francium.tech
http://francium.tech/http
francium.tech/http