问题描述
我正在测试适用于 Python 的 oracle REGEXP_SUBSTR
函数和正则表达式,或者诸如 https://regex101.com/ 之类的 Web 测试工具不适用于 Oracle。
示例:
((?:NF\s{0,1}EN){0,1}[\s]{0,1}ISO[\s]{0,1}[\d]{3,6}(?:[\:]{0,1}\d{1,4}){0,1}[\-]{0,1}\d{0,1})
字符串:VAS H M1582/950-80 ABCDFEF - ISO4014
匹配: ISO4014
,但 oracle regexp_like
不匹配:
不匹配:
SELECT REGEXP_SUBSTR (
'VAS H M1582/950-80 ABCDFEF - ISO4014','((?:NF\s{0,1})')
FROM DUAL;
有什么想法吗?
解决方法
你可以使用
(NF\s?EN)?\s?ISO\s?\d{3,6}(:?\d{1,4})?-?\d?
注意:
- Oracle regex 不“喜欢”
[\s]
,即括号内的速记字符类,您不应该那样使用它们 -
{0,1}
等于?
(出现一次或零次) -
(?:...)
不支持非捕获组,您应该将它们替换为捕获组。 (请注意,(:?
不是非捕获组,它只是模式中第二个捕获组开头的可选冒号)。
您可以将我的 XT_REGEXP 用于 PCRE 兼容的正则表达式:https://github.com/xtender/XT_REGEXP
select *
from
table(xt_regexp.get_matches(
'VAS H M1582/950-80 ABCDFEF - ISO4014','((?:NF\s{0,1}EN){0,1}[\s]{0,1}ISO[\s]{0,1}[\d]{3,6}(?:[\:]{0,1}\d{1,4}){0,1}[\-]{0,1}\d{0,1})'
));
结果:
COLUMN_VALUE
------------------------------
ISO4014
1 row selected.