2012-11-06 81 views
1

我試圖在自由文本中識別街角。scala:正則表達式用於查找x個單詞之前和x個單詞之後的某個短語

我有一個街道列表,我在尋找,鑑於以下文本

the corner of Saint John and Mac Dowell. 

the store on Saint John and Mac Dowell. 

將返回類似

(Saint John) (Mac Dowell) 
正則表達式

我正在考慮像

.*((?:\w+\b+){5})and\b+((?:\w+\b+){5}).* 

得到「and」前面的5個單詞和後面的5個單詞。 (我沒有超過五個字街道名稱)

但我甚至無法找到一個方法來匹配的話

如果我

scala> val corner = """.*((?:\w+\b+){2}).*""".r 
scala> val corner(c) = "word1 word2 word3" 

嘗試的certaing量它不符合在所有...

(我不使用\因爲我要考慮到;:等,單詞分隔符。)

-

感謝m.buettner的答案,我可以得到更接近我想要實現

現在我有:

val corner = """.*((?:\W+\w+){1,5})\W+and\W+((?:\w+\W+){1,5}).*""".r 

val corner(a,b) = "the store located at Saint John street and Mac Dowell Avenue, is a great place" 
a: String = " street" 
b: String = "Mac Dowell Avenue, is a " 

我唯一的問題是,我期望的是「位於聖約翰街道「而不是」街道「。這不是默認情況下熱切嗎?

+0

不支持斯卡拉向前看,向後看? – Bergi

回答

2

問題是\b不消耗任何字符,它只是檢查當前位置是在一個單詞和一個非單詞字符或字符串邊界之間。但你不必使用\s,你可以使用\W(代表任何非單詞字符):

.*?((?:\w+\W+){1,5})and((?:\W+\w+){1,5}).* 

可是你爲什麼不直接使用:

the corner of\W+(.*)\W+and\W+(.*)\W* 
+0

非常感謝你的回答,它真的幫了我很大的忙,現在我被前五個單詞卡住了。我更新了這個問題。我不能僅僅使用你給出的公式,因爲文本不是那麼固定的,唯一的我告訴我可能指的是一個角落是這個短語的「和」部分。 – opensas

+0

@opensas問題是'。*'也是貪婪的,所以它會消耗所有的東西,直到'約翰',然後重複進行,只能得到一個單詞。我會相應地改變我的問題 –

+0

謝謝!現在它像一個魅力... – opensas

相關問題