【问题标题】:Extract a portion of text using RegEx使用 RegEx 提取部分文本
【发布时间】:2009-07-09 23:34:48
【问题描述】:

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

2222 Main at King Edward Vancouver BC CA

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

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

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

除了lookbehind regex之外,还有什么更优雅的方式来提取部分文本?

非常感谢任何建议或其他方向的观点。

谢谢!

【问题讨论】:

  • 仅供参考,您使用的是前瞻,而不是后瞻。

标签: regex extract lookbehind


【解决方案1】:

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

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

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

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

【讨论】:

  • 我就是这么想的。哦,好吧,我想我得去做那些乱七八糟的事情了。谢谢瑞恩!
【解决方案2】:

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

.*(?=,? ([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 上测试

【讨论】:

  • 谢谢维克多!我将尝试使用更多数据对其进行测试。
  • 有人可以发一个 JSFiddle 吗?
【解决方案3】:

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

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

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

【讨论】:

  • 感谢您的意见。欣赏!
猜你喜欢
  • 2021-10-14
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多