替换第一个单词开头之前的所有单词(正则表达式和Ruby)

时间:2018-02-02 14:38:44

标签: ruby regex

以下是我的测试用例。

预期:

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" 

3 个答案:

答案 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})

See code in use here

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