【问题标题】:Match regex works for one search, but scan does not匹配正则表达式适用于一次搜索,但扫描不起作用
【发布时间】:2012-09-17 17:55:13
【问题描述】:

以下内容为我提供了一场比赛:

query = http://0.0.0.0:9393/review?first_name=aoeu&last_name=rar
find = /(?<=(\?|\&)).*?(?=(\&|\z))/.match(query)

当我检查“发现”时,我得到:

first_name=aoeu

我想匹配 '?' 之间的所有内容和一个'&',所以我尝试了

find = query.scan(/(?<=(\?|\&)).*?(?=(\&|\z))/)

但是当我检查“发现”时,我现在得到:

[["?", "&"], ["&", ""]]

我需要做什么才能获得:

[first_name=aoeu][last_name=rar]

["first_name=aoeu","last_name=rar"]

?

【问题讨论】:

  • 我认为Ruby 不支持lookbehind (?&lt;=(\?|\&amp;))
  • 我用.net 风格测试了你的表达,效果很好。
  • @sawa 真的吗?但是当我在我的 RegexBuddy 3.5.4 上测试它时它失败了。
  • @JohnWoo 你用的是什么版本的 Ruby?

标签: ruby regex


【解决方案1】:

使用String#split

query.split(/[&?]/).drop(1)

query[/(?<=\?).*/].split("&")

但如果你的真正目的是从url中提取参数,那么question and its answer

【讨论】:

  • 谢谢!对于其他被此绊倒的人,query.split(/[&?]/).drop(1) 导致我要求的第二种情况。
  • @shicholas 我意识到了这一点,并改变了我的答案,但你修改的原始答案可能会更好。
【解决方案2】:

如果您需要从 URI 中提取查询参数,请查看线程 "How to extract URL parameters from a URL with Ruby or Rails?"。它包含很多不使用正则表达式的解决方案。

【讨论】:

    【解决方案3】:

    使用 ruby​​ 或 rails 提供的其他模块将使您的代码更具可维护性和可读性。

    require 'uri'
    uri = 'http://0.0.0.0:9393/review?first_name=aoeu&last_name=rar'
    
    require 'rack'
    require 'rack/utils'
    Rack::Utils.parse_query(URI.parse(uri).query)
    # => {"first_name"=>"aoeu", "last_name"=>"rar"}
    
    # or CGI
    require 'cgi'
    CGI::parse(URI.parse(uri).query)
    # => {"first_name"=>["aoeu"], "last_name"=>["rar"]}
    

    【讨论】:

      猜你喜欢
      • 2016-10-10
      • 2018-11-13
      • 2022-10-13
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多