2015-12-15 3 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

Число в mysql shouls совпадают, как [0-9] or [[:digit:]]
\d не работает, как вы ожидали.link

try;

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. Тогда длина Strin г варьируется (от комментариев)
  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

Привет, Правэ, нет. Он всегда будет начинаться с BBB-999-, а затем будет иметь комбинацию цифр и букв, за которыми следует '\ - [0-9] {3}' или '\ - [0-9] {2} [AZ] {1 } ', за которым следует .XYZ Мне нужно заменить все 00 в тех, которые находит ваше регулярное выражение с помощью _MARK_ Hope, это имеет смысл :) – 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, чтобы заставить его работать.

Нажмите на ссылку ниже для запущенной демки:

SQLFiddle

Если вы хотите на самом деле изменить значение в pod колонки вы можете попробовать UPDATE:

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 Fiddle, чтобы убедиться в себе. –

+0

Привет @ tim-biegeleisen, спасибо, что сейчас работает, Как я могу заменить значения, найденные выбором внутри фактической таблицы, а не просто отображать его на выходе? – georgelappies

Смежные вопросы