如果我有一个字符串数组(包括符号),我如何去除符号构成非单词的元素?

时间:2016-10-15 05:11:09

标签: ruby regex

我有一个如下所示的数组:

> uniq_words
=> ["Welcome",
 "Occurred",
 "John (CPA)",
 "{",
 "if(",
 ")",
 "//",
 "target",
 "=",
 "}",
 "else",
 "target.style.display",
 "The",
 "web",
 "site"]

如您所见,此数组中有一些元素是代码位,并且{(

这是它变得棘手的地方,我想要做的是删除明显不是单词的元素 - 所以像=}if()应该被删除(或*&^%$等任何其他符号。)

但关键是背景。

John (CPA)不应该被剥夺,Mr. SmithJohnson & Johnson等也不应该被剥夺。

那么我该如何清理这些元素的uniq_words?我想我可能会使用.select和一些正则表达式,但是如何将所有部分组合在一起?

修改1

Per Cary的评论,我基本上要做的是搜索网站上的所有文字以查找姓名。但是,某些名称可能包含旁边的标题(如John Brown (MBA))。所以我不希望任何字符串显然不是一个字,几乎肯定不是一个名字。由于显而易见的原因,空间是必须的。

我不需要正则表达式来完全匹配名称,因为我知道这几乎是不可能的,我只是不希望它允许明显的非单词(例如//=或{{ 1}},不排除()等有效字符串。

我希望澄清它。

1 个答案:

答案 0 :(得分:1)

在你澄清之后,我想出的最好的是:

input.grep(/\A[\p{Alnum}\s]+(\([\p{Alnum}\s]+\))?\z/)
#⇒ [
#  [0] "Welcome",
#  [1] "Occurred",
#  [2] "John (CPA)",
#  [3] "target",
#  [4] "else",
#  [5] "The",
#  [6] "web",
#  [7] "site"
# ]

删除尾随问号以搜索名称​​仅限标题

input.grep(/\A[\p{Alnum}\s]+(\([\p{Alnum}\s]+\))\z/)
#⇒ ["John (CPA)"]

常客正在使用proper unicode character classes来匹配“Köhl”和/或“Liña”等名称。