string = "12jdfndjseven456sfjithree"
words = %w[one two three four five six seven eight nine]
pattern = Regexp.union(words) # or %r{#{words.join('|')}} or /#{words.join('|')}/
# => /one|two|three|four|five|six|seven|eight|nine/
string.scan(pattern)
# => ["seven", "three"]
input = "12jdfndjseven456sfjithree"
numbers = %w[one two three four five six seven eight nine]
output = numbers.select { |number| input.include?(number) }
# Result: ["three", "seven"]
input = "twone"
numbers = %w[one two three four five six seven eight nine]
output = numbers.select { |number| input.include?(number) }
# Result: ["one", "two"]
2条答案
按热度按时间u3r8eeie1#
如果你有目标单词数组,你可以用管道
|
连接单词数组竖线元字符(
|
)可以用在括号中表示交替:两个或多个子表达式,其中任何一个都可以匹配目标字符串在使用这个Regexp进行扫描之后,
字符串
vaqhlq812#
您可以直接询问输入字符串是否包含您选择的任何数字,从而避免在答案上使用正则表达式。
字符串
此解决方案也适用于您在以前的评论中提出的问题
@linneabell:只是一个后续问题-我如何添加一个积极的前瞻模式,使它识别单词,即使他们是重叠的?例如。twone(二/一)
型
通过一些基准测试,我发现这个解决方案似乎比使用正则表达式的解决方案性能更好。它也看起来更可读,因为它使用更自然的语言方法来识别输入字符串中的数字。此外,即使数字重叠,它也可以检测到数字,例如
"twone"
,"sevenine"
和"threeight"
。最后,如果保留匹配数字的顺序对您至关重要,那么一种方法可以是根据它们在输入字符串中的位置对输出进行排序。
型
即使包含了这一行额外的代码,基准测试表明它在速度方面仍然优于正则表达式。