0

次のような文字列からタイトル、場所、価格を抽出する必要があります。

10' Starcraft pop up camper (Newport) $5500

どちらがどれであるかは明らかなはずです。

ただし、次のような場合もあります。

10' (approx.) Starcraft pop up camper (Drigg's Town, PA) $5500

_

単純な正規表現を使用すると、最初の文字列は正しく一致しますが、2 番目の文字列は一致しません。

^(?<title>.+?) \((?<area>.+?)\) \$(?<price>[\d]+)$

_

先読み/後方参照でこれを処理できると確信していますが、方法がわかりません。誰かが説明を手伝ってくれますか?(そして、このテーマに関する読みやすい記事への参照かもしれません。)

4

1 に答える 1

4

titleたった 2 つの例で、私が提案できる最善の方法は、グループをキャプチャするために遅延量指定子を貪欲な量指定子に変更することです。

^(?<title>.+) \((?<area>.+?)\) \$(?<price>[\d]+)$
           ^^
          Here

事実上、areaキャプチャ グループのパターンは、最後の括弧内 ()のテキストをキャプチャするようになりました (キャプチャ グループによって一致できるテキストがその後に続く場合price)。

貪欲な量指定子はtitle、可能な限り多くのテキストを消費し、areaキャプチャ グループに可能な限り遠い一致を強制します。


areaもう 1 つの方法は、キャプチャ グループのサブパターンに次のものが含まれていないことを確認すること()です。

^(?<title>.+) \((?<area>[^()]+)\) \$(?<price>[\d]+)$
           ^^           ^^^^^^
          Here           Here

冗長なので、遅延量指定子も削除します。ブラケット文字を一致させる方法は 1 つしかありません。これは、キャプチャ グループ()によってキャプチャされたテキストの前後です。area


上記の 2 つの解決策でareaは、括弧()文字が含まれないことを前提としています。それを許可したい場合、パターンは少し複雑になります。

于 2013-05-02T13:26:47.273 に答える