我有以下字符串,我想从中提取任何不包含数字或特殊字符的'单词'。目前,可以使用逗号、问号或句号:
b? Dl )B 4(V! A. MK, YtG ](f 1m )CNxuNUR {PG?
所需输出:
b? Dl A. MK, YtG
5
当前输出:
b? Dl A. MK, YtG 1m
6
目前,下面的函数成功地从字符串中删除了数字,但是同时包含数字和字母的单词没有被省略。因此,'1m'包含在我当前的输出中。
当前功能:
def howMany(sentence)
if sentence.is_a? String
output = sentence.split
count = 0
test_output = []
output.each {|word|
if word !~ /D/ || word =~ /[!@#$%^&*()_+{}[]:;'"/\><]/
count
else
test_output.push(word)
count += 1
end
}
puts test_output
puts count
else
puts "Please enter a valid string"
end
end
我的假设是,我必须以某种方式遍历字符串中的每个单词,以查找它是否包含数字,但是,我不确定如何处理这个特定的解决方案。我想在我的output.each
函数中使用.split("")
,但经过几次尝试后没有成功。
如有任何建议,我将不胜感激。
提前感谢!
这是String#scan
使用正则表达式的作业。
str = "b? Dl )B 4(V! A. MK, YtG ](f 1m )CNxuNUR {PG?"
str.scan(/(?<!S)[a-z.,?rn]+(?!S)/i)
#=> ["b?", "Dl", "A.", "MK,", "YtG"]
Ruby演示<子><一口>& lt;一口>¯(ツ)/¯<一口>在一口>子>
PCRE演示我包含了到regex101.com的链接,这是一个测试正则表达式的流行站点,因为它提供了广泛的信息,特别是,通过将鼠标停留在表达式的每个元素上,可以获得其功能的解释。(即通过将光标悬停。)由于该站点不支持Ruby的正则表达式引擎(Onigmofor v2.0+),我选择了PCRE正则表达式引擎,在这种情况下,它提供了与Ruby引擎相同的结果。
正则表达式可以写成自由空格模式以使其自文档化。
/
(?<!S) # negative lookbehind asserts that the following match is
# not preceded by a character other than a whitespace
[a-z.,?rn]+ # match one or more of the indicated characters
(?!S) # negative lookahead asserts that the previous match is
# not followed by a character other than a whitespace
/ix # case-insensitive and free-spacing regex definition modes
或者,为了避免需要负向后看和负向前看,可以在空白处分割,然后选择:
a.select { |s| s.match?(/A[a-z.,?rn]+z/i) }
#=> ["b?", "Dl", "A.", "MK,", "YtG"]
我建议你试试这样做。
使用拆分sentence.split(' ')
将句子转换为数组。然后只允许使用filter
匹配模式的那些然后对两个放置操作使用过滤列表。它看起来应该是这样的。
def how_many(sentence)
sentence.split(' ').filter { |word| matches_pattern?(word) }.tap do |words|
puts words.size
puts words # or words.join(' ')
end
end
def matches_pattern?(word)
word.matches? /some_regular_expression/
end
当然,您可以相应地修改以添加任何副例,例如c。这将是一个更习惯的解决方案。
注意,你也可以使用.filter(&method(:matches_pattern?))
,但这可能会让一些人感到困惑。
编辑: rubular.com是一个尝试regexp的好地方。
编辑:当事情变得困难时,试着把它们分成更小的块(即尽量不让方法超过5行)。