scala:正则表达式,用于查找之前的x个单词和单个短语之后的x个单词

时间:2012-11-06 06:53:13

标签: regex scala

我正在尝试用自由文本识别街角。

我有一个街道列表,我正在寻找一个给出以下文字的正则表达式

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}).*

在“和”之前得到五个单词,在它之后得到5个单词。 (我的街道名称不超过五个字)

但我甚至找不到匹配一定数量单词的方法

如果我尝试

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

根本不匹配......

(我没有使用\ s,因为我想考虑,;:等作为单词分隔符)

-

感谢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 "

我遇到的唯一问题是,我希望一个“位于圣约翰街”,而不仅仅是“街道”。默认情况下不要急于求成吗?

1 个答案:

答案 0 :(得分:2)

问题是\b不消耗任何字符,只是检查当前位置是在单词和非单词字符之间还是字符串边界。但您不必使用\s,可以使用\W(代表任何非单词字符):

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

但你为什么不简单地使用:

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