代码之家  ›  专栏  ›  技术社区  ›  bragboy

替换第一个单词开头之前的所有单词(Regex和Ruby)

  •  0
  • bragboy  · 技术社区  · 7 年前

    这是我的测试用例。

    预期:

    JUNKINFRONThttp://francium.tech 应该是 http://francium.tech JUNKINFRONThttp://francium.tech/http 应该是 http://francium.tech/http francium.tech/http 应该是 弗朗西姆。技术/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 回复  |  直到 7 年前
        1
  •  2
  •   ctwheels    7 年前

    根据我最初的评论,您可以使用如下所示的模式。如果你想 真的很小 为了提高性能,您可以使用第二种模式来删除regex中的一个步骤。如果您特别关心性能,那么最后一个性能会更快。

    ^.*?(?=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
    
        2
  •  2
  •   bragboy    7 年前

    我想这可以解决你的问题。

    str1 = 'JUNKINFRONThttp://francium.tech'# should be http://francium.tech 
    str2 = 'JUNKINFRONThttp://francium.tech/http'# should be http://francium.tech/http
    str3 = 'francium.tech/http' #should be francium.tech/http (unaffected)
    str4 = 'JUNKINFRONThttps://francium.tech/http'# should be https://francium.tech/http
    
    [str1, str2, str3, str4].each do |str|
      puts str.gsub(/^.*(http|https):\/\//i, "\\1://")
    end
    
    Result:
    http://francium.tech
    http://francium.tech/http
    francium.tech/http
    https://francium.tech/http
    
        3
  •  2
  •   Night Train David Hoffman    7 年前

    使用regex时,应确保使用唯一字符串,如 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
    

    通过使用组,我们可以使用它进行替换,另一种方法是使用积极的前瞻