一个单词出现后的正则表达式

时间:2015-09-15 21:53:54

标签: sql regex oracle oracle11g

我使用正则表达式在单词出现后找到文本。

Fiddle demo

问题是某些地址对大房子使用不同的缩写:有些空间有点有点

  • Quinta
  • QTA
  • QTA。

我希望在出现任何文字之后的所有文字。无视案例。

我尝试了这个,但不确定如何包含多个开始

SELECT
  REGEXP_SUBSTR ("Address",  '[^QUINTA]+') "REGEXPR_SUBSTR"
  FROM Address;

1 个答案:

答案 0 :(得分:3)

解决方案:

我相信这会与您想要的缩写相匹配:

SELECT
  REGEXP_REPLACE("Address",  '^.*Q(UIN)?TA\.? *|^.*', '', 1, 1, 'i') 
    "REGEXPR_SUBSTR"
  FROM Address;

Demo in SQL fiddle

说明:

它试图匹配字符串的所有内容:

  • 直至找到Q + UIN(可选) + TA + {{ 1}}(可选) + 任意数量的空格。
  • 如果找不到,则将整个字符串与.匹配。
  • 由于我正在使用REGEXP_REPLACE,它会将匹配替换为空字符串,从而删除所有字符,直到“^.*”,其任何替换或整个字符串。

注意传递给REGEXP_REPLACE的最后一个参数:QTA。这是一个设置案例的标志 - i nsensitive match(flags described here)。

您有兴趣制作可选项的部分使用'i',该( pattern )是具有?量词(which makes it optional)的组。因此,Q(UIN)?TA匹配“QUINTA”或“QTA”。

或者,在您的问题范围内,如果您需要不同的选项,则需要将alternation|一起使用。例如,(pattern1|pattern2|etc)匹配3个选项中的任何一个。此外,正则表达式(QUINTA|QTA)与<{1>}完全相同

您的模式出了什么问题:

您尝试的构造(Q(UIN)?TA)使用character class,它匹配 [^QUINTA]+Q,{{之外的任何字符1}},UIN,重复1次或更多次。但它适用于字符,而不是。例如,T完全匹配字符串“A”,但无法匹配“[^QUINTA]+”。