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,但最多允许六位数字。
我一直在用大括号括起来的数字,但是它们似乎只影响返回的字符数,而不影响必须出现的字符数。