使用RegEx提取部分文本

时间:2009-07-09 23:34:48

标签: regex extract lookbehind

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

2222 Main at King Edward Vancouver BC CA

但地址大部分时间都有不同的格式。我尝试使用Lookbehind Regex并推出了这个表达式:

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

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

除了后视正则表达式之外,还有更优雅的方法来提取文本的一部分吗?

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

谢谢!

3 个答案:

答案 0 :(得分:2)

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

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

实施例。 regex1 =地址#grabber,regex2 =街道类型抓取器,regex3 =名称抓取器。

尝试使用regex1,regex2和最后的regex3匹配string1。转到下一个字符串。

答案 1 :(得分:1)

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

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

您可能希望前面有^\d+以获得良好的衡量标准 而且我没有费心去指定邮政编码的长度......只是这个字符串中的任意数量的字符。

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

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

它指的是城市,州和国家最后有三个字,但除此之外,就像ryansstack说的那样,如果它是随机的,它将无法工作。如果这个城市像纽约这样的两个词就行不通。是的...正则表达式不适合这个。

btw:在regexhero.net上测试

答案 2 :(得分:0)

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

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

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