我正在写小Rails api应用程序,我需要分析字符串以找到给出字符串的单词:
假设我的源文字为hello mr one two three four nine nineteen
并且我想检查on
的出现,则会产生:one
,如果我检查ne t
的出现在相同的字符串中,它将导致one two
。
我知道子串有一种丑陋的方式,计算位置并以这种方式解析字符串,但我认为它可以通过正则表达式扫描来解决。
如果您需要一些其他信息,请说明,谢谢。
答案 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"
它的工作方式是找到你要查找的子字符串,然后将附加到子字符串末尾的任何附加字符分组,停在两端的第一个空格处。