包含Ruby中给定字符串的单词

时间:2016-07-15 13:45:20

标签: ruby-on-rails ruby regex string

我正在写小Rails api应用程序,我需要分析字符串以找到给出字符串的单词:

假设我的源文字为hello mr one two three four nine nineteen并且我想检查on的出现,则会产生:one,如果我检查ne t的出现在相同的字符串中,它将导致one two

我知道子串有一种丑陋的方式,计算位置并以这种方式解析字符串,但我认为它可以通过正则表达式扫描来解决。

如果您需要一些其他信息,请说明,谢谢。

2 个答案:

答案 0 :(得分:3)

▶ str = 'hello mr one two three four nine nineteen'
#⇒ "hello mr one two three four nine nineteen"
▶ re = ->(pattern) { /\p{L}*#{pattern}\p{L}*/ }
▶ str[re.('ne t')]
#⇒ "one two"
▶ str[re.('on')]
#⇒ "one"

Matcher \p{L}通常优于\w,尤其是\S,因为它匹配所有utf-8字母

为了匹配重音字母(即在“天真”中合并),应该扩展左右匹配器:

▶ re = ->(pattern) { /[\p{L}\p{Mc}]*#{pattern}[\p{L}\p{Mc}]*/ }

请注意,上面的代码将返回第一场比赛。要返回所有匹配项,请使用String#scan代替String#[]

▶ str.scan re.('ni')
#⇒ ["nine", "nineteen"]

答案 1 :(得分:0)

使用正则表达式:

search = "on"
/\s([^\s]*#{search}.[^\s]*)\s/.match("hello mr one two three four nine nineteen")[1]
#  returns "one"

search = "ne t"
/\s([^\s]*#{search}.[^\s]*)\s/.match("hello mr one two three four nine nineteen")[1]
#  returns "one two"

它的工作方式是找到你要查找的子字符串,然后将附加到子字符串末尾的任何附加字符分组,停在两端的第一个空格处。