我正在尝试用自由文本识别街角。
我有一个街道列表,我正在寻找一个给出以下文字的正则表达式
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 "
我遇到的唯一问题是,我希望一个“位于圣约翰街”,而不仅仅是“街道”。默认情况下不要急于求成吗?
答案 0 :(得分:2)
问题是\b
不消耗任何字符,只是检查当前位置是在单词和非单词字符之间还是字符串边界。但您不必使用\s
,可以使用\W
(代表任何非单词字符):
.*?((?:\w+\W+){1,5})and((?:\W+\w+){1,5}).*
但你为什么不简单地使用:
the corner of\W+(.*)\W+and\W+(.*)\W*