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

ruby regex problem text.gsub[^\w-],'')失败

  •  6
  • scubabbl  · 技术社区  · 17 年前

    我正在尝试学习Ruby中的regex,这是基于我在“Rails方式”中读到的内容。但是,即使是这个简单的例子也让我很困惑。我不知道是不是打字错误…

    text.gsub(/\s/,“-”).gsub([^\w-],“”).downcase

    在我看来,这将用-替换所有空格,然后在任何字符串以非字母或数字开头,后跟破折号的地方,将其替换为“”。但是,使用irb时,它首先在^“语法错误,意外的'^’,预期的']'”上失败,如果我取出^,它在w上再次失败。

    我很困惑。

    5 回复  |  直到 15 年前
        1
  •  9
  •   Vinko Vrsalovic    17 年前
    >> text = "I love spaces"
    => "I love spaces"
    >> text.gsub(/\s/, "-").gsub(/[^\W-]/, '').downcase
    => "--"
    

    失踪/

    尽管这有点道理:(-)

    >> text.gsub(/\s/, "-").gsub(/([^\W-])/, '\1').downcase
    => "i-love-spaces"
    

    这可能就是它的意思

    >> text.gsub(/\s/, "-").gsub(/[^\w-]/, '').downcase
    => "i-love-spaces"
    

    \ W表示“一个字也没有” \ W表示“一个词”

    //生成regexp对象

    /[^ \W-] /类 = ReGEXP

        2
  •  3
  •   Orion Edwards    17 年前

    步骤1: Add this to your bookmarks . 每当我需要查找正则表达式时,这是我的第一站

    第二步:让我们浏览一下您的代码

    text.gsub(/\s/, "-")
    

    你在打电话给 gsub 函数,并给它两个参数。
    第一个参数是 /\s/ ,它是ruby for“创建一个包含 \s (对于正则表达式,/就像是特殊的“”)。
    第二个参数是字符串 "-" .

    因此,这将用连字符替换所有空白字符。到目前为止,一切都很好。

    .gsub([^\W-], '').downcase
    

    接下来,再次调用gsub,传递2个参数。 第一个参数是 [^\W-] . 因为我们没有在正斜杠中引用它,所以Ruby实际上会尝试运行该代码。 [] 创建一个数组,然后它尝试 ^\W- 到数组中,这是无效的代码,因此它将中断。
    将其更改为 /[^\W-]/ 给我们一个有效的正则表达式。

    看看雷吉克斯 [] 说“匹配这个组中的任何字符”。该组包含 \W (指非文字字符)和 - ,所以regex应该匹配任何非单词字符或任何连字符。

    由于传递给gsub的第二件事是一个空字符串,它最终应该用空字符串替换所有非单词字符和连字符(从而将它们剥离出来)。

    .downcase
    

    它只是将字符串转换为小写。

    希望这有帮助:—)

        3
  •  2
  •   Khoth    17 年前

    你忘了斜杠。应该是 /[^\W-]/

        4
  •  2
  •   Vinko Vrsalovic    17 年前

    好吧,.gsub(/[^\w-]/,''表示替换任何非单词或非-for Nothing的单词。

    你可能想要

    >> text.gsub(/\s/, "-").gsub(/[^\w-]/, '').downcase
    => "i-love-spaces"
    

    小写\w(\w正好相反)

        5
  •  1
  •   Khoth    17 年前

    斜线表示它们之间的内容是正则表达式,就像引号表示它们之间的内容是字符串一样。