2013-12-19 43 views
1

對於在Oracle數據庫11g上運行的regexp_like。我想要一個模式來匹配一個不以AM或AP開頭的字符串,這個字符串通常是幾個字母后跟一個下劃線和其他字母或下劃線。 例如:PL/SQL:字符串regexp_like不以字母開頭

字符串: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; 
/

回答

0

試試這個:

^([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 

^$是錨,並表示「字符串的開始」,並

+0

請問什麼是 '?!'意思?謝謝 – Frank

+0

@Frank:'(?!..)'是一個負面的前瞻,意思是「不跟隨」,但我已經刪除它,因爲PLSQL似乎不支持這個功能。刷新你的頁面。 –

+0

它不工作,我測試了'D_HTCEVOBLKHS_BX''AD_HTCEVOBLKHS_BX',它應該返回true,但都返回false。 – Frank

1

爲什麼你需要正則表達式爲什麼你不能用簡單的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 
+0

對不起,我正在調用一個API程序,它需要傳遞一個正則表達式模式作爲參數使其工作。而且已經有數十種其他模式被定義,我不能對字符串進行硬編碼,它是動態輸入的。 – Frank

0

我想你只需要這樣:

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

因爲它是你不需要任何更多的正則表達式LIKE功能。

1

如果你有圖案的表,然後:

SQL Fiddle

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

查詢1

-- Negative Matches: 
SELECT string 
FROM strings s 
     LEFT OUTER JOIN 
     patterns p 
     ON (REGEXP_LIKE(string, pattern)) 
WHERE p.pattern IS NULL 

Results

|   STRING | 
|-------------------| 
| BM_HTCEVOBLKHS_BX | 
| A_HTCEVODSAP_DSSD | 
| A_HTCEVOB_A_CDSED | 
| MP_HTCEVOBLKHS_BX | 

查詢2

-- Positive Matches: 
SELECT DISTINCT 
     string 
FROM strings s 
     INNER JOIN 
     patterns p 
     ON (REGEXP_LIKE(string, pattern)) 

Results

|   STRING | 
|-------------------| 
| AM_HTCEVOBLKHS_BX | 
| AP_HTCEVOBLKHSPBX | 

查詢3

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

Results

|   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

-- Negative Matches: 
SELECT string 
FROM strings 
WHERE NOT REGEXP_LIKE(string, '^(AM|AP)') 

Results

|   STRING | 
|-------------------| 
| BM_HTCEVOBLKHS_BX | 
| A_HTCEVODSAP_DSSD | 
| A_HTCEVOB_A_CDSED | 
| MP_HTCEVOBLKHS_BX | 

查詢5

-- Positive Matches: 
SELECT string 
FROM strings 
WHERE REGEXP_LIKE(string, '^(AM|AP)') 

Results

|   STRING | 
|-------------------| 
| AM_HTCEVOBLKHS_BX | 
| AP_HTCEVOBLKHSPBX | 

查詢6

-- All Matches: 
SELECT string, 
     CASE WHEN REGEXP_LIKE(string, '^(AM|AP)') 
      THEN 'True' 
      ELSE 'False' 
      END AS Matched 
FROM strings 

Results

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

Nice work @MTO .. –

相關問題