正则表达式以排除大括号之间的值,并在其余部分应用模式



>我在字段中有以下值

Aa11
BBB-
BBB+
A- /*-
A3
Ca

我会使用正则表达式

(([A-Z](([abc]+d?)|d))|([A-Z]+[+-]?)

工作正常。 但是,现在我有另一组新数据

(p)A3
(q)A- /*-

如何确保忽略它们之间的括号和值以应用上述正则表达式?

我正在使用甲骨文中的REGEX_SUBSTR来做到这一点。

则表达式(.*?)将匹配左括号和右括号,它们之间应尽可能少的字符,[^(]*?将匹配零个或尽可能少的非左括号字符。您可以组合这些内容以提供正则表达式^([^(]*?(.*?))*?[^(]*?,该正则表达式将匹配尽可能少的括号组(前提是您没有嵌套括号(,直到找到所需的模式。

SQL 小提琴

Oracle 11g R2 架构设置

CREATE TABLE data ( value ) AS
SELECT 'Aa11' FROM DUAL UNION ALL
SELECT 'BBB-' FROM DUAL UNION ALL
SELECT 'BBB+' FROM DUAL UNION ALL
SELECT 'A- /*-' FROM DUAL UNION ALL
SELECT 'A3' FROM DUAL UNION ALL
SELECT 'Ca' FROM DUAL UNION ALL
SELECT '(p)A3' FROM DUAL UNION ALL
SELECT '(q)A- /*-' FROM DUAL UNION ALL
SELECT '(Ca)Cb(Cc)' FROM DUAL UNION ALL
SELECT '--(Ca)--(Cb)--Cc(--Ca)' FROM DUAL;

查询 1

SELECT value,
       REGEXP_SUBSTR(
         value,
         '^([^(]*?(.*?))*?[^(]*?([A-Z]([abc]+d?|d|[A-Z]*[+-]?))',
         1,    -- Start at 1st character
         1,    -- Find the 1st occurrence
         NULL, -- No flags
         2     -- Return 2nd capturing group
       ) AS regex_output
FROM   data

结果

|                  VALUE | REGEX_OUTPUT |
|------------------------|--------------|
|                   Aa11 |          Aa1 |
|                   BBB- |         BBB- |
|                   BBB+ |         BBB+ |
|                 A- /*- |           A- |
|                     A3 |           A3 |
|                     Ca |           Ca |
|                  (p)A3 |           A3 |
|              (q)A- /*- |           A- |
|             (Ca)Cb(Cc) |           Cb |
| --(Ca)--(Cb)--Cc(--Ca) |           Cc |

最新更新