2015-12-15 110 views
6

好日子爲什麼這個正則表達式查詢不返回任何結果?

我有有行看起來像

BBB-888-8557ZZV-003.XYZ 
BBB-999-8787ZZV-00D.XYZ 

我需要找到一個場(和替換我確定後,我選擇返回正確的行:))匹配正則表達式的所有記錄:

/-\d\d[A-Z]/g 

因此,所有字段都有一個負號後跟兩位數字後跟一個字母。

我也只需要過濾其中有999個字段。

我嘗試以下SQL,但它不返回任何結果:一旦被發現

SELECT * 
FROM `track` 
WHERE (
pod LIKE "BBB-999%" 
AND pod 
REGEXP '/-\d\d[A-Z]/g' 
) 

而且,這將是一個快速的,爲什麼來代替所有這些領域:

BBB-999-8787ZZV-_MARK_D.XYZ 
+1

我已經給你一個解決方案,它可以用字符串處理任意長度。請看看是否有機會,謝謝。 –

回答

3

編號:

SQLFiddle

如果你想在實際中pod列更改值,你可以嘗試使用UPDATE匹配像[0-9] or [[:digit:]]
\d不會像你期望的那樣工作。link

嘗試;

SELECT * 
FROM `track` 
WHERE 
pod LIKE "BBB-999%" and 
pod REGEXP '\-[0-9]{2}[A-Z]{1}' 

SELECT * 
FROM `track` 
WHERE 
pod LIKE "BBB-999%" and 
pod REGEXP '\-[[:digit:]]{2}[A-Z]{1}' 

sql fiddle demo

更新字段具有-00[A-Z].XYZ-MARK[A_Z].XYZ

  1. 然後長度〜應變的這個圖是(從評論)
  2. 最後8個字符改變可以是\-[0-9]{3}.XYZ\-[0-9]{2}[A-Z]{1}.XYZ

嘗試:

UPDATE `track` 
SET `pod` = concat(reverse(substr(reverse(`pod`) from 8)), 'MARK', substr(`pod` from -5)) 
WHERE 
`pod` LIKE "BBB-999%" and 
`pod` REGEXP '\-0{2}[A-Z]{1}'; 

sql fiddle demo

+0

感謝Praveen,這項工作100%我現在怎麼能替換表中的所有00 [A-Z]匹配與_MARK_ [A-Z]? – georgelappies

+0

'pod'值是否爲具有'xxx-xxx-xxxxxxx-xxx.xxx'模式的固定長度數據? – Praveen

+0

嗨Praveen,不,不是。它始終以BBB-999開頭,然後會有數字和字母組合,後跟'\ - [0-9] {3}'或'\ - [0-9] {2} [AZ] {1 }'緊接着.XYZ我需要用你的正則表達式找到的所有00替換_MARK_希望這有道理:) – georgelappies

3

你可以在限制查詢後使用CONCAT()函數在輸出中獲取替換。

SELECT CONCAT(SUBSTRING(pod, 1, LENGTH(pod) - LOCATE('-', REVERSE(pod)) + 1), 
       '_MARK_D.XYZ') 
FROM `track` 
WHERE 
(
    pod LIKE "BBB-999%" 
    AND pod REGEXP '-[0-9][0-9][A-Z]' 
) 

出於某種原因,我需要使用[0-9]在MySQL正則表達式來得到它的工作。

點擊下面的鏈接,運行演示:在mysql shouls

UPDATE `track` 
SET pod = CONCAT(SUBSTRING(pod, 1, LENGTH(pod) - LOCATE('-', REVERSE(pod)) + 1), 
       '_MARK_D.XYZ') 
WHERE 
(
    pod LIKE "BBB-999%" 
    AND pod REGEXP '-[0-9][0-9][A-Z]' 
) 
+1

我現在工作了。訣竅是使用'[0-9]'來表示正則表達式中的任何數字。請嘗試SQL小提琴來協助您自己。 –

+0

嗨@ tim-biegeleisen,謝謝你現在正在工作,我怎樣才能替換實際表中的select所找到的值,而不僅僅是它在輸出中顯示? – georgelappies

相關問題