>我在字段中有以下值
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 |