0

我需要从这样的字符串中提取标题、位置和价格:

10' Starcraft pop up camper (Newport) $5500

哪个是哪个应该很明显。

但是,也有这样的情况:

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

_

当我使用简单的正则表达式时,我可以正确匹配第一个字符串,但不能正确匹配第二个:

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

_

我很确定前瞻/反向引用可以处理这个问题,但我不知道如何。有人可以帮我解释一下吗?(并且可能引用了一篇关于该主题的易于阅读的文章。)

4

1 回答 1

4

只有 2 个示例,我可以建议的最好的方法是将惰性量词更改为贪婪量词以title捕获组:

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

实际上,area捕获组中的模式现在将捕获最后一个括号内 ()的文本(假设它后面是可以被price捕获组匹配的文本)。

中的贪婪量词title消耗尽可能多的文本,并强制area捕获组进行尽可能远的匹配。


另一种方法是确保area捕获组中的子模式不包含()

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

我还删除了惰性量词,因为它是多余的。匹配括号字符的方法只有一种(),即在area捕获组捕获的文本之前和之后。


上面的 2 个解决方案假定area永远不会包含括号()字符。如果你想允许的话,模式会稍微复杂一些。

于 2013-05-02T13:26:47.273 回答