我想将不同的字符/子字符串更改为单个字符或nil
。我想将"How to chop an onion?"
更改为"how-chop-onion"
。
string
.gsub(/'s/,'')
.gsub(/[?&]/,'')
.gsub('to|an|a|the','')
.split(' ')
.map { |s| s.downcase}
.join '-'
使用竖线字符|
不起作用。如何使用gsub
?
答案 0 :(得分:8)
to|an|a|the
是模式,您将它用作String。这里:
str.gsub('to|an|a|the', '') # passing string argument
#=> "How to chop an onion?"
str.gsub(/to|an|a|the/, '') # passing pattern argument
#=> "How chop onion?"
答案 1 :(得分:2)
▶ "How to chop an onion?".gsub(/'s|[?&]+|to|an|a|the/,'')
.downcase.split(/\s+/).join '-'
#⇒ "how-chop-onion"
答案 2 :(得分:2)
首先列出你想要做的事情:
现在考虑应该执行这些操作的顺序。转换为小写可以随时进行,但首先执行它很方便,在这种情况下,正则表达式不需要无关紧要。在某些单词之前应删除标点符号,以便更容易识别单词而不是子字符串。显然必须在删除单词后删除多余的空格。因此,我们希望订单为:
在下壳后,可以使用三个链式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"
s来完成:
\b
请注意,如果r2
中没有单词break("plese don't y of you know how chop vcdo"
),我们就会得到:
gsub
此外,第一个tr(',?','')
可以替换为:
delete(',?')
或:
gsub
这些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"
可以组合成一个(我怎么写),如下所示:
{{1}}
" Lookarounds" (这里是一个积极的前瞻)通常被称为"零宽度",这意味着,虽然匹配是必需的,但它们不构成返回的匹配的一部分。
1你有没有想过条款"小写" "大写"来自?在印刷的早期,排版机将金属可移动型保持在两种情况下,一种位于另一种之上。那些用于开始句子和专有名词的较高字母属于大写字母;其余的是小写的。