0

我想使用正则表达式提取文本的一部分。例如,我有一个地址,想只返回数字和街道并排除其余的:

2222 Main at King Edward Vancouver BC CA

但是大多数时候地址的格式会有所不同。我尝试使用 Lookbehind Regex 并得出了这个表达式:

.*?(?=\w* \w* \w{2}$)

上面的表达式很好地处理了上面的例子,但是一旦逗号进入文本,邮政编码可以是一个 6 个字符的字符串或两个 3 个字符的字符串,中间有一个空格等等,它就会变得太混乱......

除了后向正则表达式之外,还有什么更优雅的方式来提取部分文本?

非常感谢任何建议或另一个方向的观点。

谢谢!

4

3 回答 3

2

正则表达式适用于遵循模式的常规数据。因此,如果您的数据是完全随机的,不,使用正则表达式没有优雅的方法。

另一方面,如果你知道你想要什么值,你可以编写一些简单的正则表达式,然后在每个字符串上测试它们。

前任。regex1= 地址#grabber,regex2 = 街道类型grabber,regex3 = 名字grabber。

尝试使用 regex1、regex2 和最后的 regex3 在 string1 上进行匹配。继续下一个字符串。

于 2009-07-09T23:42:29.213 回答
1

好吧,我想我会把我的帽子扔进戒指:

.*(?=,? ([a-zA-Z]+,?\s){3}([\d-]*\s)?)

并且您可能想要^\d+在前面进行很好的衡量
,我没有费心指定邮政编码的长度......只是在这个中任何数量的字符连字符。

到目前为止,它适用于这些输入以及城市/州/国家区域内昏迷的变化:

  • 2222 Main at King Edward Vancouver, BC, CA, 333-333
  • 555 路和街道地点 CA US 95000
  • 2222 Main at King Edward Vancouver BC CA 333
  • 555 路和街道地方 CA US

它在城市,州和国家的末尾有三个单词计数,但除此之外,就像 ryansstack 所说,如果它是随机的,它将不起作用。如果这个城市是像纽约这样的两个词,那就行不通了。是的...正则表达式不是这个工具。

顺便说一句:在 regexhero.net 上测试

于 2009-07-09T23:59:40.957 回答
0

我可以想到两种方法可以做到这一点

1)如果您知道地址之后的“其余”数据正好是 2 个字段,即 BC 和 CA,您可以使用空格作为分隔符对字符串进行拆分,删​​除最后 2 个项目。

2) 对分隔符 /[AZ][AZ]/ 进行拆分并将结果存储在数组中。然后打印出数组(前提是地址不包含 2 个或更多大写字母)

于 2009-07-10T00:14:58.890 回答