【问题标题】:Regex in Ruby: expression not foundRuby 中的正则表达式:找不到表达式
【发布时间】:2013-01-15 09:26:57
【问题描述】:

我在使用 Ruby(在 Rails 上)中的正则表达式时遇到问题。我对此比较陌生。

测试字符串是: http://www.xyz.com/017010830343?$ProdLarge$

我正在尝试删除“$ProdLarge$”。换句话说,$ 符号和介于两者之间的任何符号。

我的正则表达式是: \$\w+\$

Rubular 说我的表情没问题。 http://rubular.com/r/NDDQxKVraK

但是当我运行我的代码时,应用程序说它没有找到匹配项。代码如下:

some_array.each do |x|
   logger.debug "scan #{x.scan('\$\w+\$')}"
   logger.debug "String? #{x.instance_of?(String)}"

   x.gsub!('\$\w+\$','scl=1')

   ...

我的记录器调试行显示“[]”的结果。字符串被确认为真。并且 gsub 行没有任何作用。

我需要纠正什么?

【问题讨论】:

  • 您传递的字符串包含一个正则表达式而不是一个实际的正则表达式。

标签: ruby-on-rails ruby regex


【解决方案1】:

使用/regex/ 代替'regex'

> "http://www.xyz.com/017010830343?$ProdLarge$".gsub(/\$\w+\$/, 'scl=1')
=> "http://www.xyz.com/017010830343?scl=1"

【讨论】:

    【解决方案2】:

    不要为此任务使用正则表达式,请使用专为它设计的工具URI。要删除查询:

    require 'uri'
    
    url = URI.parse('http://www.xyz.com/017010830343?$ProdLarge$')
    url.query = nil
    
    puts url.to_s
    => http://www.xyz.com/017010830343
    

    要更改为不同的查询,请使用此而不是 url.query = nil

    url.query = 'scl=1'
    
    puts url.to_s
    => http://www.xyz.com/017010830343?scl=1
    

    URI 会在必要时自动对值进行编码,为您省去麻烦。如果您需要更多 URL 管理功能,请查看Addressable::URI

    【讨论】:

    • 谢谢。我没有意识到 URI 这么方便。在这个特定的应用程序中,我认为需要使用某种形式的正则表达式,因为查询实际上可能比这里的示例复杂得多。但我会在某处应用它。
    • 除非您提供准确的示例来说明您所面临的问题,否则我们无法帮助您。通过编辑将其他示例添加到原始问题中。
    猜你喜欢
    • 2011-08-06
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多