2016-07-15 141 views
-1
给定的字符串

我在写小Rails的API应用程序,我需要分析字符串以找到具有类似指定的字符串的话:词包括红宝石

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

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

请说,如果您需要一些额外的信息,谢谢。

回答

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#[]String#scan代替:

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

谢谢你,这是我需要的! – AndreyS

+0

...或放入方法:'def match(str,pattern); STR [/ [\ p {L} \ p {了Mc}] *#{图案} [\ p {L} \ p {了Mc}] * /]; end'。 (ятоже) –

+0

谢谢,卡里,感谢它! – mudasobwa

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" 

它的工作原理是它发现你正在寻找的子字符串,然后组的方式,连接到您的子在第一空白停止两端的任何其他字符两端。

+1

'[^ \ S]'被写为'\ S',和您的解决方案将匹配标点符号,如逗号,顿号等除此之外,它不会匹配字符串开头的字(在给出的例子中是“hello”)和结束字符串的字(“nineteen”)。这就是说,这个解决方案既不稳健也不正确。 – mudasobwa