【发布时间】:2012-02-26 08:35:55
【问题描述】:
我必须编写一个查询,其中将基于 java 的正则表达式(我相信 POSIX 标准)发送到存储过程。它将使用此正则表达式字符串来查询数据库以仅获取那些满足正则表达式的记录。
我正在阅读有关 Regular Expressions 的信息,我看到 oracle 正则表达式与 Java 不同,即
在 10g 版本中,Oracle 数据库提供了 4 个正则表达式函数,您可以 可以在 SQL 和 PL/SQL 语句中使用。这些函数实现 POSIX 扩展正则表达式 (ERE) 标准。甲骨文完全 支持在括号中整理序列和等价类 表达式。 NLS_SORT 设置确定使用的 POSIX 语言环境, 它决定了可用的整理顺序和等价性 类。
但是,Oracle 并没有完全实现 POSIX ERE 标准。它 偏离三个方面。首先,Oracle 支持反向引用 \1 通过正则表达式中的 \9。 POSIX ERE 标准不 支持这些,即使 POSIX BRE 支持。在完全符合 引擎,\1 到 \9 将是非法的。 POSIX 标准规定了它 转义不是元字符的字符是非法的 反斜杠。 Oracle 允许这样做,并且简单地忽略反斜杠。例如。 \z 与 Oracle 中的 z 相同。结果是所有 POSIX ERE Oracle 可以使用正则表达式,但有些正则表达式 在 Oracle 中工作的表达式可能会导致完全错误 符合 POSIX 标准的引擎。显然,如果您只使用 Oracle,这些 差异无关紧要。
第三个区别更微妙。它不会导致任何错误,但是 可能会导致不同的匹配。正如我在关于 POSIX 标准,它要求正则表达式引擎返回最长的 在交替的情况下匹配。 Oracle 的引擎不这样做。它是 一个传统的 NFA 引擎,就像所有讨论过的非 POSIX 正则表达式一样 在这个网站上。
如果您在其他编程中使用过正则表达式 语言,请注意 POSIX 不支持不可打印 字符转义如 \t 用于制表符或 \n 用于换行符。您可以使用 这些使用 C++ 等编程语言的 POSIX 引擎,因为 C++ 编译器将解释字符串常量中的 \t 和 \n。在 SQL 语句,您需要在 带有正则表达式的字符串,以使其与制表符或行匹配 休息。 Oracle 的正则表达式引擎会将字符串 '\t' 解释为 正则表达式 t 作为正则表达式参数传递时。
只是想知道是否有某种帮助可以用来解决这个问题?还是我必须将 Java 正则表达式转换为 PLSQL 正则表达式?
我们将要使用的正则表达式将在 Java 中广泛使用。很少有将相同的正则表达式应用于 oracle 存储过程的用例。示例 regex 之一是 .*__.*__^ABC
我相信,如果我能知道这两个版本的不兼容之处会更有帮助:)
【问题讨论】:
-
正如您的报价所解释的,这取决于正则表达式 - 一些正则表达式将在两种实现中都有效。你能告诉我们你的正则表达式吗?到目前为止你尝试了什么?
-
is to send to a stored procedure你为什么要这么做?写一个oracle-compatible regex 很简单。 -
如果正则表达式由 PL/SQL 存储过程执行,那么它应该是 Oracle 正则表达式,不是吗?从 Java 的角度来看,正则表达式只是传递给 Oracle 的纯字符串。应该没有理由进行任何正则表达式转换。
-
请查看我更新的问题
标签: java regex stored-procedures plsql oracle11g