我正在尝试显示用户帖子中的单词数组。然而,我正在使用的方法像空格一样处理撇号。
<%= var = Post.pluck(:body) %>
<%= var.join.downcase.split(/\W+/) %>
因此,如果输入文本是:The baby's foot
它会输出the
baby
s
foot
,
但它应该是the
baby's
foot
。
我如何做到这一点?
答案 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]/
- 这意味着所有不是撇号和字符的字符。