ruby 扫描字符串中没有空格的单词

eivnm1vs  于 2024-01-07  发布在  Ruby
关注(0)|答案(2)|浏览(120)

我正在尝试从Ruby中的字符串中提取单词。例如,如果我有:
“12jdfndjseven456sfjithree”
我想得到一个包含[“seven”,“three”]的数组。我唯一要找的单词是数字1.
我还希望它们按照它们在字符串中出现的顺序排列,所以不要只想做if/include,因为我认为这会按照扫描它们的顺序排列它们(除非我错了?)
我想也许你可以做一个正则表达式扫描,但我在正则表达式可怕,所以不知道从哪里开始,因为它的话不是数字。

u3r8eeie

u3r8eeie1#

如果你有目标单词数组,你可以用管道|连接单词数组
竖线元字符(|)可以用在括号中表示交替:两个或多个子表达式,其中任何一个都可以匹配目标字符串
在使用这个Regexp进行扫描之后,

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"]

字符串

vaqhlq81

vaqhlq812#

您可以直接询问输入字符串是否包含您选择的任何数字,从而避免在答案上使用正则表达式。

input = "12jdfndjseven456sfjithree"

numbers = %w[one two three four five six seven eight nine]

output = numbers.select { |number| input.include?(number) }

# Result: ["three", "seven"]

字符串
此解决方案也适用于您在以前的评论中提出的问题
@linneabell:只是一个后续问题-我如何添加一个积极的前瞻模式,使它识别单词,即使他们是重叠的?例如。twone(二/一)

input = "twone"

numbers = %w[one two three four five six seven eight nine]

output = numbers.select { |number| input.include?(number) }

# Result: ["one", "two"]


通过一些基准测试,我发现这个解决方案似乎比使用正则表达式的解决方案性能更好。它也看起来更可读,因为它使用更自然的语言方法来识别输入字符串中的数字。此外,即使数字重叠,它也可以检测到数字,例如"twone""sevenine""threeight"
最后,如果保留匹配数字的顺序对您至关重要,那么一种方法可以是根据它们在输入字符串中的位置对输出进行排序。

output.sort_by { |number| input.index(number) }


即使包含了这一行额外的代码,基准测试表明它在速度方面仍然优于正则表达式。

相关问题