1

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

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

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个单词。(我没有超过五个字的街道名称)

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

如果我尝试

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 "

我唯一的问题是,我希望 a 位于“圣约翰街”,而不仅仅是“街道”。默认情况下不应该是渴望的吗?

4

1 回答 1

2

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

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

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

the corner of\W+(.*)\W+and\W+(.*)\W*
于 2012-11-06T09:00:27.293 回答