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

Regex to exclude values between braces and apply pattern on the rest

我在字段中有以下值

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

我会使用正则表达式

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

效果很好。然而,现在我有了另一组新数据

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

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

我正在使用 oracle 中的 REGEX_SUBSTR 执行此操作。

正则表达式 \(.*?\) 将匹配开括号和右括号之间的字符越少越好,[^(]*? 将匹配 zero-or-as-few-as-possible non-open 括号字符。您可以组合这些以提供正则表达式 ^([^(]*?\(.*?\))*?[^(]*?,它将匹配尽可能少的括号组(前提是您没有嵌套括号),直到找到所需的模式。

SQL Fiddle

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

Results:

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