Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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
PL/SQL:regexp_like表示字符串不以字母开头_Regex_Oracle_Plsql - Fatal编程技术网

PL/SQL:regexp_like表示字符串不以字母开头

PL/SQL:regexp_like表示字符串不以字母开头,regex,oracle,plsql,Regex,Oracle,Plsql,对于类似于在Oracle数据库11g上运行的regexp_。我想要一个模式来匹配字符串,而不是以AM或AP开头,字符串通常是几个字母,后跟下划线和其他字母或下划线。 例如: 字符串:AM_HTCEVOBLKHS_BX[false] 字符串:AP_HTCEVOBLKHSPBX[false] 字符串:BM_HTCEVOBLKHS_BX[true] 字符串:A_HTCEVODSAP_DSSD[true] 字符串:A_HTCEVOB_A_CDSED[true] 字符串:MP_HTCEVOBLKHS_BX

对于类似于在Oracle数据库11g上运行的regexp_。我想要一个模式来匹配字符串,而不是以AM或AP开头,字符串通常是几个字母,后跟下划线和其他字母或下划线。 例如:

字符串:AM_HTCEVOBLKHS_BX[false]
字符串:AP_HTCEVOBLKHSPBX[false]
字符串:BM_HTCEVOBLKHS_BX[true]
字符串:A_HTCEVODSAP_DSSD[true]
字符串:A_HTCEVOB_A_CDSED[true]
字符串:MP_HTCEVOBLKHS_BX[true]

你能做这个图案吗

我当前的解决方案不起作用:

BEGIN
    IF regexp_like('AM_HTCEVOBLKHS_BX','[^(AM)(AP)]+_.*') THEN
        dbms_output.put_line('TRUE');
    ELSE
        dbms_output.put_line('FALSE');
    END IF;
END;
/
试试这个:

^([B-Z][A-Z]*|A[A-LNOQ-Z]?|A[A-Z]{2,})_[A-Z_]+$
其思想是描述字符串的所有可能开始部分

(                 # a group
    [B-Z][A-Z]*   # The first character is not a "A"
  |               # OR
    A[A-LNOQ-Z]?  # a single "A" or a "A" followed by a letter except "P" or "M"
  |               # OR
    A[A-Z]{2,}    # a "A" followed by more than 1 letter
)                 # close the group

^
$
是锚点,表示“字符串的开始”和“字符串的结束”

为什么需要regexp为什么不使用简单substr

with t1 as
 (select 'AM_HTCEVOBLKHS_BX' as f1
    from dual
  union all
  select 'AP_HTCEVOBLKHSPBX'
    from dual
  union all
  select 'BM_HTCEVOBLKHS_BX'
    from dual
  union all
  select 'A_HTCEVODSAP_DSSD'
    from dual
  union all
  select 'A_HTCEVOB_A_CDSED'
    from dual
  union all
  select 'MP_HTCEVOBLKHS_BX' from dual
  union all
  select null from dual
  union all
  select '1' from dual)

select f1,
       case
           when substr(f1, 1, 2) in ('AM', 'AP') then
            'false'
           else
            'true'
       end as check_result
  from t1

我想你只需要这个:

not regexp_like( field, '^(AM_)|^(AP_)' )

由于它是一个类似的函数,您不需要在regex表达式上使用更多的函数。

如果您有一个模式表,那么:

Oracle 11g R2架构设置

CREATE TABLE strings ( string ) AS
          SELECT 'AM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'AP_HTCEVOBLKHSPBX' FROM DUAL
UNION ALL SELECT 'BM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'A_HTCEVODSAP_DSSD' FROM DUAL
UNION ALL SELECT 'A_HTCEVOB_A_CDSED' FROM DUAL
UNION ALL SELECT 'MP_HTCEVOBLKHS_BX' FROM DUAL;

CREATE TABLE patterns ( pattern ) AS
          SELECT '^AM' FROM DUAL
UNION ALL SELECT '^AP' FROM DUAL;
-- Negative Matches:
SELECT string
FROM   strings s
       LEFT OUTER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
WHERE  p.pattern IS NULL
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT DISTINCT
       string
FROM   strings s
       INNER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string,
                              ( SELECT LISTAGG( pattern, '|' ) WITHIN GROUP ( ORDER BY NULL )
                                FROM   patterns )
                            )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings s
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |
-- Negative Matches:
SELECT string
FROM   strings
WHERE  NOT REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT string
FROM   strings
WHERE  REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string, '^(AM|AP)' )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |
查询1

CREATE TABLE strings ( string ) AS
          SELECT 'AM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'AP_HTCEVOBLKHSPBX' FROM DUAL
UNION ALL SELECT 'BM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'A_HTCEVODSAP_DSSD' FROM DUAL
UNION ALL SELECT 'A_HTCEVOB_A_CDSED' FROM DUAL
UNION ALL SELECT 'MP_HTCEVOBLKHS_BX' FROM DUAL;

CREATE TABLE patterns ( pattern ) AS
          SELECT '^AM' FROM DUAL
UNION ALL SELECT '^AP' FROM DUAL;
-- Negative Matches:
SELECT string
FROM   strings s
       LEFT OUTER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
WHERE  p.pattern IS NULL
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT DISTINCT
       string
FROM   strings s
       INNER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string,
                              ( SELECT LISTAGG( pattern, '|' ) WITHIN GROUP ( ORDER BY NULL )
                                FROM   patterns )
                            )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings s
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |
-- Negative Matches:
SELECT string
FROM   strings
WHERE  NOT REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT string
FROM   strings
WHERE  REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string, '^(AM|AP)' )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |

CREATE TABLE strings ( string ) AS
          SELECT 'AM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'AP_HTCEVOBLKHSPBX' FROM DUAL
UNION ALL SELECT 'BM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'A_HTCEVODSAP_DSSD' FROM DUAL
UNION ALL SELECT 'A_HTCEVOB_A_CDSED' FROM DUAL
UNION ALL SELECT 'MP_HTCEVOBLKHS_BX' FROM DUAL;

CREATE TABLE patterns ( pattern ) AS
          SELECT '^AM' FROM DUAL
UNION ALL SELECT '^AP' FROM DUAL;
-- Negative Matches:
SELECT string
FROM   strings s
       LEFT OUTER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
WHERE  p.pattern IS NULL
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT DISTINCT
       string
FROM   strings s
       INNER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string,
                              ( SELECT LISTAGG( pattern, '|' ) WITHIN GROUP ( ORDER BY NULL )
                                FROM   patterns )
                            )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings s
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |
-- Negative Matches:
SELECT string
FROM   strings
WHERE  NOT REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT string
FROM   strings
WHERE  REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string, '^(AM|AP)' )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |
查询2

CREATE TABLE strings ( string ) AS
          SELECT 'AM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'AP_HTCEVOBLKHSPBX' FROM DUAL
UNION ALL SELECT 'BM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'A_HTCEVODSAP_DSSD' FROM DUAL
UNION ALL SELECT 'A_HTCEVOB_A_CDSED' FROM DUAL
UNION ALL SELECT 'MP_HTCEVOBLKHS_BX' FROM DUAL;

CREATE TABLE patterns ( pattern ) AS
          SELECT '^AM' FROM DUAL
UNION ALL SELECT '^AP' FROM DUAL;
-- Negative Matches:
SELECT string
FROM   strings s
       LEFT OUTER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
WHERE  p.pattern IS NULL
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT DISTINCT
       string
FROM   strings s
       INNER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string,
                              ( SELECT LISTAGG( pattern, '|' ) WITHIN GROUP ( ORDER BY NULL )
                                FROM   patterns )
                            )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings s
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |
-- Negative Matches:
SELECT string
FROM   strings
WHERE  NOT REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT string
FROM   strings
WHERE  REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string, '^(AM|AP)' )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |

CREATE TABLE strings ( string ) AS
          SELECT 'AM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'AP_HTCEVOBLKHSPBX' FROM DUAL
UNION ALL SELECT 'BM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'A_HTCEVODSAP_DSSD' FROM DUAL
UNION ALL SELECT 'A_HTCEVOB_A_CDSED' FROM DUAL
UNION ALL SELECT 'MP_HTCEVOBLKHS_BX' FROM DUAL;

CREATE TABLE patterns ( pattern ) AS
          SELECT '^AM' FROM DUAL
UNION ALL SELECT '^AP' FROM DUAL;
-- Negative Matches:
SELECT string
FROM   strings s
       LEFT OUTER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
WHERE  p.pattern IS NULL
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT DISTINCT
       string
FROM   strings s
       INNER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string,
                              ( SELECT LISTAGG( pattern, '|' ) WITHIN GROUP ( ORDER BY NULL )
                                FROM   patterns )
                            )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings s
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |
-- Negative Matches:
SELECT string
FROM   strings
WHERE  NOT REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT string
FROM   strings
WHERE  REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string, '^(AM|AP)' )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |
查询3

CREATE TABLE strings ( string ) AS
          SELECT 'AM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'AP_HTCEVOBLKHSPBX' FROM DUAL
UNION ALL SELECT 'BM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'A_HTCEVODSAP_DSSD' FROM DUAL
UNION ALL SELECT 'A_HTCEVOB_A_CDSED' FROM DUAL
UNION ALL SELECT 'MP_HTCEVOBLKHS_BX' FROM DUAL;

CREATE TABLE patterns ( pattern ) AS
          SELECT '^AM' FROM DUAL
UNION ALL SELECT '^AP' FROM DUAL;
-- Negative Matches:
SELECT string
FROM   strings s
       LEFT OUTER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
WHERE  p.pattern IS NULL
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT DISTINCT
       string
FROM   strings s
       INNER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string,
                              ( SELECT LISTAGG( pattern, '|' ) WITHIN GROUP ( ORDER BY NULL )
                                FROM   patterns )
                            )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings s
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |
-- Negative Matches:
SELECT string
FROM   strings
WHERE  NOT REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT string
FROM   strings
WHERE  REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string, '^(AM|AP)' )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |

CREATE TABLE strings ( string ) AS
          SELECT 'AM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'AP_HTCEVOBLKHSPBX' FROM DUAL
UNION ALL SELECT 'BM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'A_HTCEVODSAP_DSSD' FROM DUAL
UNION ALL SELECT 'A_HTCEVOB_A_CDSED' FROM DUAL
UNION ALL SELECT 'MP_HTCEVOBLKHS_BX' FROM DUAL;

CREATE TABLE patterns ( pattern ) AS
          SELECT '^AM' FROM DUAL
UNION ALL SELECT '^AP' FROM DUAL;
-- Negative Matches:
SELECT string
FROM   strings s
       LEFT OUTER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
WHERE  p.pattern IS NULL
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT DISTINCT
       string
FROM   strings s
       INNER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string,
                              ( SELECT LISTAGG( pattern, '|' ) WITHIN GROUP ( ORDER BY NULL )
                                FROM   patterns )
                            )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings s
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |
-- Negative Matches:
SELECT string
FROM   strings
WHERE  NOT REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT string
FROM   strings
WHERE  REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string, '^(AM|AP)' )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |
如果要将模式作为单个字符串传递,则:

查询4

CREATE TABLE strings ( string ) AS
          SELECT 'AM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'AP_HTCEVOBLKHSPBX' FROM DUAL
UNION ALL SELECT 'BM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'A_HTCEVODSAP_DSSD' FROM DUAL
UNION ALL SELECT 'A_HTCEVOB_A_CDSED' FROM DUAL
UNION ALL SELECT 'MP_HTCEVOBLKHS_BX' FROM DUAL;

CREATE TABLE patterns ( pattern ) AS
          SELECT '^AM' FROM DUAL
UNION ALL SELECT '^AP' FROM DUAL;
-- Negative Matches:
SELECT string
FROM   strings s
       LEFT OUTER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
WHERE  p.pattern IS NULL
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT DISTINCT
       string
FROM   strings s
       INNER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string,
                              ( SELECT LISTAGG( pattern, '|' ) WITHIN GROUP ( ORDER BY NULL )
                                FROM   patterns )
                            )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings s
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |
-- Negative Matches:
SELECT string
FROM   strings
WHERE  NOT REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT string
FROM   strings
WHERE  REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string, '^(AM|AP)' )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |

CREATE TABLE strings ( string ) AS
          SELECT 'AM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'AP_HTCEVOBLKHSPBX' FROM DUAL
UNION ALL SELECT 'BM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'A_HTCEVODSAP_DSSD' FROM DUAL
UNION ALL SELECT 'A_HTCEVOB_A_CDSED' FROM DUAL
UNION ALL SELECT 'MP_HTCEVOBLKHS_BX' FROM DUAL;

CREATE TABLE patterns ( pattern ) AS
          SELECT '^AM' FROM DUAL
UNION ALL SELECT '^AP' FROM DUAL;
-- Negative Matches:
SELECT string
FROM   strings s
       LEFT OUTER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
WHERE  p.pattern IS NULL
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT DISTINCT
       string
FROM   strings s
       INNER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string,
                              ( SELECT LISTAGG( pattern, '|' ) WITHIN GROUP ( ORDER BY NULL )
                                FROM   patterns )
                            )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings s
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |
-- Negative Matches:
SELECT string
FROM   strings
WHERE  NOT REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT string
FROM   strings
WHERE  REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string, '^(AM|AP)' )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |
查询5

CREATE TABLE strings ( string ) AS
          SELECT 'AM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'AP_HTCEVOBLKHSPBX' FROM DUAL
UNION ALL SELECT 'BM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'A_HTCEVODSAP_DSSD' FROM DUAL
UNION ALL SELECT 'A_HTCEVOB_A_CDSED' FROM DUAL
UNION ALL SELECT 'MP_HTCEVOBLKHS_BX' FROM DUAL;

CREATE TABLE patterns ( pattern ) AS
          SELECT '^AM' FROM DUAL
UNION ALL SELECT '^AP' FROM DUAL;
-- Negative Matches:
SELECT string
FROM   strings s
       LEFT OUTER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
WHERE  p.pattern IS NULL
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT DISTINCT
       string
FROM   strings s
       INNER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string,
                              ( SELECT LISTAGG( pattern, '|' ) WITHIN GROUP ( ORDER BY NULL )
                                FROM   patterns )
                            )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings s
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |
-- Negative Matches:
SELECT string
FROM   strings
WHERE  NOT REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT string
FROM   strings
WHERE  REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string, '^(AM|AP)' )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |

CREATE TABLE strings ( string ) AS
          SELECT 'AM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'AP_HTCEVOBLKHSPBX' FROM DUAL
UNION ALL SELECT 'BM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'A_HTCEVODSAP_DSSD' FROM DUAL
UNION ALL SELECT 'A_HTCEVOB_A_CDSED' FROM DUAL
UNION ALL SELECT 'MP_HTCEVOBLKHS_BX' FROM DUAL;

CREATE TABLE patterns ( pattern ) AS
          SELECT '^AM' FROM DUAL
UNION ALL SELECT '^AP' FROM DUAL;
-- Negative Matches:
SELECT string
FROM   strings s
       LEFT OUTER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
WHERE  p.pattern IS NULL
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT DISTINCT
       string
FROM   strings s
       INNER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string,
                              ( SELECT LISTAGG( pattern, '|' ) WITHIN GROUP ( ORDER BY NULL )
                                FROM   patterns )
                            )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings s
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |
-- Negative Matches:
SELECT string
FROM   strings
WHERE  NOT REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT string
FROM   strings
WHERE  REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string, '^(AM|AP)' )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |
查询6

CREATE TABLE strings ( string ) AS
          SELECT 'AM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'AP_HTCEVOBLKHSPBX' FROM DUAL
UNION ALL SELECT 'BM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'A_HTCEVODSAP_DSSD' FROM DUAL
UNION ALL SELECT 'A_HTCEVOB_A_CDSED' FROM DUAL
UNION ALL SELECT 'MP_HTCEVOBLKHS_BX' FROM DUAL;

CREATE TABLE patterns ( pattern ) AS
          SELECT '^AM' FROM DUAL
UNION ALL SELECT '^AP' FROM DUAL;
-- Negative Matches:
SELECT string
FROM   strings s
       LEFT OUTER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
WHERE  p.pattern IS NULL
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT DISTINCT
       string
FROM   strings s
       INNER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string,
                              ( SELECT LISTAGG( pattern, '|' ) WITHIN GROUP ( ORDER BY NULL )
                                FROM   patterns )
                            )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings s
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |
-- Negative Matches:
SELECT string
FROM   strings
WHERE  NOT REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT string
FROM   strings
WHERE  REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string, '^(AM|AP)' )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |

CREATE TABLE strings ( string ) AS
          SELECT 'AM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'AP_HTCEVOBLKHSPBX' FROM DUAL
UNION ALL SELECT 'BM_HTCEVOBLKHS_BX' FROM DUAL
UNION ALL SELECT 'A_HTCEVODSAP_DSSD' FROM DUAL
UNION ALL SELECT 'A_HTCEVOB_A_CDSED' FROM DUAL
UNION ALL SELECT 'MP_HTCEVOBLKHS_BX' FROM DUAL;

CREATE TABLE patterns ( pattern ) AS
          SELECT '^AM' FROM DUAL
UNION ALL SELECT '^AP' FROM DUAL;
-- Negative Matches:
SELECT string
FROM   strings s
       LEFT OUTER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
WHERE  p.pattern IS NULL
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT DISTINCT
       string
FROM   strings s
       INNER JOIN
       patterns p
       ON ( REGEXP_LIKE( string, pattern ) )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string,
                              ( SELECT LISTAGG( pattern, '|' ) WITHIN GROUP ( ORDER BY NULL )
                                FROM   patterns )
                            )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings s
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |
-- Negative Matches:
SELECT string
FROM   strings
WHERE  NOT REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| BM_HTCEVOBLKHS_BX |
| A_HTCEVODSAP_DSSD |
| A_HTCEVOB_A_CDSED |
| MP_HTCEVOBLKHS_BX |
-- Positive Matches:
SELECT string
FROM   strings
WHERE  REGEXP_LIKE( string, '^(AM|AP)' )
|            STRING |
|-------------------|
| AM_HTCEVOBLKHS_BX |
| AP_HTCEVOBLKHSPBX |
-- All Matches:
SELECT string,
       CASE WHEN REGEXP_LIKE( string, '^(AM|AP)' )
            THEN 'True'
            ELSE 'False'
            END AS Matched
FROM   strings
|            STRING | MATCHED |
|-------------------|---------|
| AM_HTCEVOBLKHS_BX |    True |
| AP_HTCEVOBLKHSPBX |    True |
| BM_HTCEVOBLKHS_BX |   False |
| A_HTCEVODSAP_DSSD |   False |
| A_HTCEVOB_A_CDSED |   False |
| MP_HTCEVOBLKHS_BX |   False |

我可以问一下“?!”是什么意思吗什么意思?Thanks@Frank:
(?!…)
是一个否定的前瞻,意思是“不后跟”,但我已经删除了它,因为PLSQL似乎不支持此功能。刷新你的页面。它不工作,我测试了“D_HTCEVOBLKHS_BX”“AD_HTCEVOBLKHS_BX”,它应该返回true,但都返回false。抱歉,我正在调用一个API过程,该过程需要将regexp模式作为参数传递才能工作。而且已经定义了几十种其他模式,我不能硬编码字符串,它是动态输入的。