【问题标题】:Match first address using regular expressions使用正则表达式匹配第一个地址
【发布时间】:2019-04-01 17:05:50
【问题描述】:

我有相当肮脏的客户地址数据。对于每个客户端,一个字符串中有 2 个或更多地址。在 Oracle 中使用正则表达式我想减去第一个。

如果有与';' 相同的分隔符,那就很容易了。但有时会有逗号。并且在地址中也使用逗号来分隔城市、街道和建筑物。

我有俄语地址,所以我为你翻译了。

例如,我有一个包含多个地址的字符串:

逗号是分隔符,但它也分隔地址内的块。
所以我可以通过匹配直到第二个'\sul\.' 的所有内容来匹配第一个地址。

但我不知道该怎么做。 Regexp_substr(address, '.*,\sul') 将返回

这远远不是我需要的。

那么我怎样才能减去直到第二个 ,\sul\. 的所有内容?

Russia, Moscow, ul. Tverskaya, d.32 应该被返回。

【问题讨论】:

  • ,\sul 无济于事,因为ul. 是您要提取的第一个地址的一部分。除非您可以描述预期匹配的开始/结束上下文,否则没有解决方案。
  • 你期望的结果是什么?
  • 我期待俄罗斯,莫斯科,ul。特维尔,d.32

标签: sql regex oracle


【解决方案1】:

您可以使用SUBSTRINSTR 而不是正则表达式来解决此要求。以下表达式应该可以满足您的需求:

SUBSTR(v, 1, INSTR(v, ', ul.', 1, 2) - 1)

INSTR() 查找字符串 ', ul.' 在源字符串中第二次出现的位置,SUBSTR() 选择从字符串开头到该位置(减 1)的所有内容。

例子:

WITH t AS (
    SELECT 'Russia, Moscow, ul. Tverskaya, d.32, ul. Yakimanka, d21, ul. Kalinina, d.43' address FROM DUAL
)
SELECT SUBSTR(address, 1, INSTR(address, ', ul.', 1, 2) - 1) adress1 FROM t
|地址1 | | :------------------------------------------------ | |俄罗斯,莫斯科,ul。特维尔,d.32 |

Demo on DB Fiddle


注意:只要字符串中确实至少出现两次给定模式,这就会起作用。如果您碰巧有与此规范不匹配的值并且您想要保留,则需要额外的测试级别,例如:

CASE INSTR(address, ', ul.', 1, 2)
    WHEN 0 THEN address
    ELSE SUBSTR(address, 1, INSTR(address, ', ul.', 1, 2) - 1) 
END adress1 

Demo on DB Fiddle

【讨论】:

  • 谢谢!它在大多数情况下都有帮助。我一定会使用这个解决方案。但正则表达式更灵活。例如,大约有 11 种街道(大道、路堤、高速公路等):) 我可以使用 regexp_substr(string, 'st|av|emb)
  • @РусланХ:我理解,但是我怀疑您的要求是否可以使用正则表达式正确解决(另请参阅 Wiktor Stribiżew 对您的原始问题的评论),所以我选择了常规的字符串操作函数。 .
猜你喜欢
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 2012-03-12
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多