包含撇号和.split()

时间:2015-12-30 17:17:22

标签: ruby-on-rails ruby

我正在尝试显示用户帖子中的单词数组。然而,我正在使用的方法像空格一样处理撇号。

<%= var = Post.pluck(:body) %>
<%= var.join.downcase.split(/\W+/) %>

因此,如果输入文本是:The baby's foot
它会输出the baby s foot
但它应该是the baby's foot

我如何做到这一点?

4 个答案:

答案 0 :(得分:4)

接受的答案太天真了:

▶ "It’s naïve approach".split(/[^'\w]+/)
#⇒ [
#  [0] "It",
#  [1] "s",
#  [2] "nai",
#  [3] "ve",
#  [4] "approach"
# ]

这是因为现在几乎有2016年,许多用户可能想要使用他们的正常名称,比如,你知道,JoséØstergaard。正如你可能会注意到的那样,标点符号不仅仅是叛逆者。

▶ "It’s naïve approach".split(/[^'’\p{L}\p{M}]+/)
#⇒ [
#  [0] "It’s",
#  [1] "naïve",
#  [2] "approach"
# ]

进一步阅读:Character Properties

答案 1 :(得分:1)

按照mudasobwa的回答,这是\w\W为聚会带来的内容:

chars = [*' ' .. "\x7e"].join
# => " !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"

这是我们在代码中看到的通常可见的低位ASCII字符。有关详细信息,请参阅the Regexp documentation

抓住与\w匹配的字符会返回:

chars.scan(/\w+/)
# => ["0123456789",
#     "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
#     "_",
#     "abcdefghijklmnopqrstuvwxyz"]

相反,抓取与\w不符或匹配\W的字符:

chars.scan(/\W+/)
# => [" !\"\#$%&'()*+,-./", ":;<=>?@", "[\\]^", "`", "{|}~"]

\w定义为[a-zA-Z0-9_],这不是您通常所说的“单词”字符。相反,它们通常是我们用来定义变量名称的字符。

如果您只处理低位ASCII字符,请使用字符类

[a-zA-Z]

例如:

chars = [*' ' .. "\x7e"].join
lower_ascii_chars = '[a-zA-Z]'
not_lower_ascii_chars = '[^a-zA-Z]'
chars.scan(/#{lower_ascii_chars}+/)
# => ["ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz"]
chars.scan(/#{not_lower_ascii_chars}+/)
# => [" !\"\#$%&'()*+,-./0123456789:;<=>?@", "[\\]^_`", "{|}~"]

您可以利用POSIX定义和character properties

,而不是定义自己的定义
chars.scan(/[[:alpha:]]+/)
# => ["ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz"]

chars.scan(/\p{Alpha}+/)
# => ["ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz"]

当从字符串中提取信息时,正则表达式总是看起来像是一个很棒的新魔杖,但是,就像发现的the Sorcerer's Apprentice一样,它们会在误用或不被理解时造成破坏。

了解这一点可以帮助您编写更多智能模式。将其应用于文档显示的内容,您应该能够轻松找出符合您需要的模式。

答案 2 :(得分:0)

使用您在评论中写入的var userNameToCheck="alice@ss.com"; var exists=db.Users.Any(x=>x.UserName==userNameToCheck||x.Email==userNameToCheck); if(!exists) { // New record. Let's continue saving it. } 调用来通过irb运行该字符串可以获得以下结果:

split

但是,如果您使用irb(main):008:0> "The baby's foot".split(/\W+/) => ["The", "baby", "s", "foot"] 而没有明确的分隔符,则会获得您正在寻找的分割:

split

那能帮到你找到你想要的东西吗?

答案 3 :(得分:0)

您可以使用以下RegEx代替/\W+/

var.join.downcase.split(/[^'\w]+/)

/\W/指的是所有非单词字符,撇号是一个非单词字符。 为了使代码保持接近原始意图,我们可以使用/[^'\w]/ - 这意味着所有不是撇号和字符的字符。