我想使用正则表达式提取文本的一部分。例如,我有一个地址,想要只返回数字和街道,并排除其余部分:
2222 Main at King Edward Vancouver BC CA
但地址大部分时间都有不同的格式。我尝试使用Lookbehind Regex并推出了这个表达式:
.*?(?=\w* \w* \w{2}$)
上面的表达式很好地处理了上面的例子,但是一旦逗号进入文本就会变得太乱,邮政编码可以是6个字符的字符串,或者两个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个或更多大写字母)