需要正则表达式从字符串中提取字段

时间:2013-05-02 13:24:24

标签: regex

我需要从字符串中提取标题,位置和价格:

10' Starcraft pop up camper (Newport) $5500

哪些是明显的。

但是,也有这样的情况:

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

_

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

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

_

我很确定前瞻/后退可以解决这个问题,但我不知道如何处理。有人可以帮我解释一下吗? (也许可以参考一篇关于这个主题的易读文章。)

1 个答案:

答案 0 :(得分:4)

只有2个例子,我能建议的最好的方法是将惰性量词改为title捕获组的贪心量词:

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

有效地,area捕获组中的模式现在将捕获最后一个括号内的文本 ()(前提是后跟可与{匹配的文本) {1}}捕获组。)

price中的贪婪量词消耗尽可能多的文本,并强制title捕获组采取尽可能最大的匹配。


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

()

我也删除了延迟量词,因为它是多余的。只有一种方法可以匹配括号^(?<title>.+) \((?<area>[^()]+)\) \$(?<price>[\d]+)$ ^^ ^^^^^^ Here Here 字符,这些字符位于()捕获组捕获的文本之前和之后。


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