2016-07-15 190 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