Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式以排除大括号之间的值,并对其余部分应用模式_Regex_Oracle_Regex Negation - Fatal编程技术网

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

Regex 正则表达式以排除大括号之间的值,并对其余部分应用模式,regex,oracle,regex-negation,Regex,Oracle,Regex Negation,我在一个字段中有以下值 Aa11 BBB- BBB+ A- /*- A3 Ca 我会用正则表达式 (([A-Z](([abc]+\d?)|\d))|([A-Z]+[+-]?) 效果很好。然而,现在我有了另一组新的数据 (p)A3 (q)A- /*- 如何确保忽略括号和括号之间的值以应用上述正则表达式 我在oracle中使用REGEX_SUBSTR来实现这一点。正则表达式\(.*?)将匹配开头和结尾括号,括号之间的字符尽可能少,而[^(]*?将匹配零个或尽可能少的非开头括号字符。您可以将这些

我在一个字段中有以下值

Aa11
BBB-
BBB+
A- /*-
A3
Ca
我会用正则表达式

(([A-Z](([abc]+\d?)|\d))|([A-Z]+[+-]?)
效果很好。然而,现在我有了另一组新的数据

(p)A3
(q)A- /*-
如何确保忽略括号和括号之间的值以应用上述正则表达式


我在oracle中使用REGEX_SUBSTR来实现这一点。

正则表达式
\(.*?)
将匹配开头和结尾括号,括号之间的字符尽可能少,而
[^(]*?
将匹配零个或尽可能少的非开头括号字符。您可以将这些字符组合起来,得到正则表达式
^([^(]*\(.*?\)*?[^(]*?
这将匹配尽可能少的括号组(前提是您没有嵌套的括号),直到找到所需的模式

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;
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 |
查询1

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

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

您的正则表达式无效。请发布有效的正则表达式,并解释确切的问题是什么。鉴于上述输入,您最终需要得到什么?您可以尝试使用:
(\([^)]*\)捕捉参数?
忽略此子项谢谢,这正是我所需要的。不过,我仍然了解此解决方案的工作原理。我已将其分解为两个步骤,删除任何带大括号的内容,然后应用较旧的正则表达式提取值