Ruby Regex问题text.gsub [^ \ W-],'')失败

时间:2020-03-06 14:46:40  来源:igfitidea点击:

我正在尝试根据《 The Rails Way》中的内容学习Ruby中的Regex。但是,即使这个简单的例子也让我很沮丧。我不知道这是不是错字...

text.gsub(/ \ s /,"-")。gsub([^ \ W-],'').downcase

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

我在这里很困惑。

解决方案

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

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

丢失的 //

虽然这更有意义:-)

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

这可能是什么意思

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

\ W表示"不是一个字"
\ w表示"一个字"

//生成一个regexp对象

/[^\W-]/.class
    => Regexp

斜线表示它们之间的东西是一个正则表达式,就像引号所说的它们之间的东西是一个字符串一样。

好吧,.gsub(/ [^ \ W-] /,'')说替换掉所有不是单词也不是没有的东西。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

你可能想要

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

小写\ w(\ W恰好相反)

第1步:将此添加到书签。每当我需要查找正则表达式时,这是我的第一站

步骤2:让我们遍历代码

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

我们正在调用gsub函数,并为其指定2个参数。
第一个参数是/ \ s /,对于"创建一个包含\ s的新正则表达式来说,它是红宝石的(对于正则表达式,//就像是特殊的"")。
第二个参数是字符串""-"`。

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

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

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

看着正则表达式," []"说"匹配该组中的任何字符。该组包含" \ W"(表示非文字字符)和"-",因此正则表达式应与任何非文字字符或者任何连字符匹配。

由于我们传递给gsub的第二件事是一个空字符串,因此最终应将所有非单词字符和连字符替换为空字符串(从而将其删除)

.downcase

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

希望这可以帮助 :-)