ORACLE REGEXP 限制?

问题描述

我正在测试适用于 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?

its demo at regex101.com

注意:

  • 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.

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...