MySQL REGEXP_SUBSTR () избежать проблемы? - PullRequest
1 голос
/ 24 мая 2019

Пожалуйста, возьмите следующий пример регулярного выражения:

https://regexr.com/4ek7r

Как видите, регулярное выражение прекрасно работает и соответствует размерам (например, 3/16 "и т. Д.) Из описаний продуктов..

Я пытаюсь реализовать это в MySQL 8.0.15, используя REGEXP_SUBSTR()

Согласно документации Я удвоил escape-символы, но регулярное выражениене работает.

Пожалуйста, смотрите следующую скрипту SQL:

https://www.db -fiddle.com / f / e6Ez3XCdU5Ahs91z6TQA8P / 0

Как вы можетевидите, REGEXP_SUBSTR() возвращает NULL

Я предполагаю, что это проблема с выходом из ситуации, но я не уверен на 100%.

Как я могу гарантировать, что MySQL вернет 1-е совпадение заproduct (row) сродни примеру regexr.com?

Приветствия

Редактировать: 28/05/2019 - основная причина

Ответ Wiktor нижерешил мою проблему, и его регулярное выражение было намного чище и стоило того, чтобы сказать, что я не понимаю, почему моя оригинальная версия не работает после порта из SQL Sкогда-либо к MySQL.Сегодня утром я наконец-то заметил проблему - это не имело ничего общего с регулярным выражением, это была ошибка новичка в конкатенации строк!В частности, я использовал UPPER(Description + ' ') (то есть, используя +) - который прекрасно работает в SQL Server, но очевидно;MySQL заставляет числовые!Таким образом, я по существу управлял своим регулярным выражением против 0!Замена + на CONCAT фактически исправила мой исходный запрос на оригинальное регулярное выражение - просто подумала, что поделюсь этим на случай, если это поможет кому-то еще!

1 Ответ

1 голос
/ 24 мая 2019

В MySQL v8.x, которая поддерживает регулярное выражение ICU, вы можете использовать

SELECT Description, REGEXP_SUBSTR(Description, '(?im)(?=\\b(?:[0-9/]+(?:\\.[0-9/]+)?\\s*(?:[X-]|$)|[0-9/\\s]+(?:\\.[0-9/]+)?(?:[CM]?M|["”TH])))[0-9/\\s.]+(?:[CM]?M|["”TH])?(?:\\s*[/X-]\\s*[0-9/\\s.]+(?:[CM]?M|["”TH])?)?(?=[.\\s()]|$)') AS Size FROM tbl_Example

Основные положения:

  • Флаги можно использовать как встроенные параметры, (?mi), m включит многострочный режим, когда ^ и $ соответствуют началу / концу строки, а i включит режим без учета регистра
  • [$] соответствует символу $, чтобы соответствоватьКонец позиции строки, вам нужно вывести $ из класса символов, в этом случае используйте чередования ((?=[\.\s\(\)$]) -> (?=[.\s()]|$), да, не выходите из того, что не должно быть экранировано тоже)
  • Соответствующая дробная часть числа, лучше использовать (?:\.[0-9/]+)? подобный шаблон (он соответствует необязательной последовательности ., а затем 1 или более цифр или / s)
  • (C|M)? лучше записать как [CM]? (класс символов более эффективен)
...