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語、その後に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 "

私が抱えている唯一の問題は、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 に答える