正则表达式-从较大的单词中隔离字符串

时间:2019-06-30 13:38:47

标签: sql regex posix db2-400

DB2 SQL中的以下正则表达式非常有效,可以从地址(即不是街道名称或数字)中获取额外的元素。为了使示例简单,我将自己限制为两种情况(UNIT或GATE),其中HAD1是包含街道地址第一行的字段:

select HAD1,                                        
 regexp_substr(HAD1,'(UNITS?|GATES?)\s[0-9A-Z]{1,}')
from ECH                                            
where regexp_like(HAD1,'(UNIT|GATE)')               
  and length(trim(HAD1)) > 12                       

我明白了:

Ship To                                             REGEXP_SUBSTR
Address                                                          
Line 1                                                           
UNIT 4, 117 MONTGOMORIE RD                          UNIT 4       
END OF WAINUI RD, HIGHGATE                          -            
UNIT 3, 37 TE ROTO DRIVE                            UNIT 3       
GATE 6 52 MAHIA ROAD                                GATE 6       
UNIT B 11 LANGSTONE LANE                            UNIT B       
ASHBURTON FITTINGS  GATE 2                          GATE 2       
GOODS: PLACEMAKERS - WESTGATE                       -            
UNIT 3, 37 TE ROTO DRIVE                            UNIT 3       
ASHBURTON FITTINGS  GATE 2                          GATE 2       
SH 8A TARRAS-LUGGATE HIGHWAY                        GATE HIGHWAY 

这是非常令人鼓舞的。它没有正确地选择HIGHGATE或WESTGATE,因为它们后面没有空格,而是其他空格。

但是它确实拾取了LUGGATE(最后一行),我不希望这样做。因此,我希望能够包括我的文本字符串前面没有任何字符。

您可能会想我是regex的初学者,因此感谢您的耐心配合。

修改 现在,我有了最出色的正则表达式,如下所示:

\b(GATE|LEVEL|DOOR|UNITS?)\s[\dA-Z]{1,}

在更大的数据集上使用它,我注意到偶尔会出现不必要的匹配,例如,GATE后跟一个普通的英语单词:

THE THIRD GATE ON THE LEFT  =  GATE ON

我要寻找的门,层,门和单位将始终跟随以下之一:(a)最多6位数字(b)一个字母(c)一个数字和一个字母,可能带有破折号

Examples:
UNIT 7A  
GATE 6
GATE 31113
UNIT B
LEVEL B2
LEVEL 2B 
UNIT D06

所以,我的跟进问题是,我可以将表达式第二部分中的字母数限制为0或1,但最多允许六位数字。

我一直在用大括号括起来的数字,但是它们似乎只影响返回的字符数,而不影响必须出现的字符数。

0 个答案:

没有答案