我有一个像这样的数组:
> uniq_words
=> ["Welcome",
"Occurred",
"John (CPA)",
"{",
"if(",
")",
"//",
"target",
"=",
"}",
"else",
"target.style.display",
"The",
"web",
"site"]
正如你所看到的,这个数组中有一些元素是位码,并且有{
和(
。
这就是它变得棘手的地方,我想做的是剥离显然是非单词的元素-所以像=
, }
, if(
和)
这样的东西应该被剥离(或任何其他符号,如*&^%$
等)。
但关键是上下文。
John (CPA)
不应该被剥离,Mr. Smith
和Johnson & Johnson
也不应该被剥离,等等
那么我如何清除uniq_words
中的这些元素呢?我想我可能会使用.select
和一些正则表达式,但是所有的部分看起来如何?
编辑1
根据Cary的评论,我实际上是在网站上搜索所有的名字。但是,有些名称可能在它们旁边包含标题(如John Brown (MBA)
)。所以我不希望任何字符串明显不是单词,也肯定不是名字。空格是必须的,原因很明显。
我不需要正则表达式完全匹配名称,因为我知道这几乎是不可能的,我只是不希望它允许明显的非单词(例如//
或=
或(
,而不排除有效的字符串,如John Brown (Esq.)
)。
经过你的解释,我想出的最好的是:
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)"]
正则使用正确的unicode字符类来匹配像" Köhl "和/或" Liña "这样的名称。