首先列出你想做的事情:
- 删除某些字词
- 删除某些标点符号
- 删除单词后删除多余的空格
- 转换为小写1
现在考虑执行这些操作的顺序。任何时候都可以转换为小写,但先做起来很方便,在这种情况下,正则表达式不需要区分大小写。应在某些单词之前删除标点符号,以便更容易地识别单词而不是子字符串。删除多余的空格显然必须在删除单词之后完成。因此,我们希望顺序是:
- 转换为小写
- 删除某些标点符号
- 删除某些字词
- 删除单词后删除多余的空格
在向下大小写之后,这可以通过三个链接的gsubs 来完成:
str = "Please, don't any of you know how to chop an avacado?"
r1 = /[,?]/ # match a comma or question mark
r2 = /
\b # match a word break
(?: # start a non-capture group
to|an|a|the # match one of these words (checking left to right)
) # end non-capture group
\b # match a word break
/x # extended/free-spacing regex definition mode
r3 = /\s\s/ # match two whitespace characters
str.downcase.gsub(r1,'').gsub(r2,'').gsub(r3,' ')
#=> "please don't any of you know how chop avacado"
请注意,如果没有 r2 中的分词 (\b),我们会得到:
"plese don't y of you know how chop vcdo"
另外,第一个 gsub 可以替换为:
tr(',?','')
或:
delete(',?')
这些gsubs 可以合二为一(我怎么写),如下:
r = /
[,?] # as in r1
| # or
\b(?:to|an|a|the)\b # as in r2
| # or
\s # match a whitespace char
(?=\s) # match a whitespace char in a postive lookahead
/x
str.downcase.gsub(r,'')
#=> "please don't any of you know how chop avacado"
“Lookarounds”(此处为正向lookahead)通常被称为“零宽度”,这意味着虽然需要匹配,但它们不构成返回的匹配的一部分。
1 你有没有想过“小写”和“大写”这两个词是从哪里来的?在印刷的早期,排字员将金属活字分为两种,一种位于另一种上方。用于句子和专有名词开头的较高字母的字母大写;其余的都是小写的。