我在寫小Rails的API應用程序,我需要分析字符串以找到具有類似指定的字符串的話:詞包括紅寶石
假設我的原文爲hello mr one two three four nine nineteen
,我想檢查on
occurence ,它會產生:one
,如果我在相同的字符串中檢查ne t
的發生,它將導致one two
。
我知道有一個醜陋的方式與子字符串,計算位置和解析字符串這種方式,但我認爲它可以解決與正則表達式掃描。
請說,如果您需要一些額外的信息,謝謝。
我在寫小Rails的API應用程序,我需要分析字符串以找到具有類似指定的字符串的話:詞包括紅寶石
假設我的原文爲hello mr one two three four nine nineteen
,我想檢查on
occurence ,它會產生:one
,如果我在相同的字符串中檢查ne t
的發生,它將導致one two
。
我知道有一個醜陋的方式與子字符串,計算位置和解析字符串這種方式,但我認爲它可以解決與正則表達式掃描。
請說,如果您需要一些額外的信息,謝謝。
▶ 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"]
使用正則表達式:
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"
它的工作原理是它發現你正在尋找的子字符串,然後組的方式,連接到您的子在第一空白停止兩端的任何其他字符兩端。
'[^ \ S]'被寫爲'\ S',和您的解決方案將匹配標點符號,如逗號,頓號等除此之外,它不會匹配字符串開頭的字(在給出的例子中是「hello」)和結束字符串的字(「nineteen」)。這就是說,這個解決方案既不穩健也不正確。 – mudasobwa
謝謝你,這是我需要的! – AndreyS
...或放入方法:'def match(str,pattern); STR [/ [\ p {L} \ p {了Mc}] *#{圖案} [\ p {L} \ p {了Mc}] * /]; end'。 (ятоже) –
謝謝,卡里,感謝它! – mudasobwa