正则表达式排除大括号之间的值并在其余部分应用模式
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 括号字符。您可以组合这些以提供正则表达式 ^([^(]*?\(.*?\))*?[^(]*?
,它将匹配尽可能少的括号组(前提是您没有嵌套括号),直到找到所需的模式。
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 |
我在字段中有以下值
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 括号字符。您可以组合这些以提供正则表达式 ^([^(]*?\(.*?\))*?[^(]*?
,它将匹配尽可能少的括号组(前提是您没有嵌套括号),直到找到所需的模式。
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 |