如何从字符串中删除特定的单词- Ruby



我有以下字符串,我想从中提取任何不包含数字或特殊字符的'单词'。目前,可以使用逗号、问号或句号:

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行)。

相关内容

  • 没有找到相关文章

最新更新