2015-03-09 2 views
0

Я работаю над базой данных MySQL и заметил, что она не поддерживает PCRE (требуется плагин).Преобразование PCRE в регулярное выражение POSIX

Я хотел бы использовать эти три для некоторой проверки данных (это на самом деле значение, приведенное в атрибут pattern):

  1. ^[A-z\. ]{3,36}
  2. ^[a-z\d\.]{3,24}$
  3. ^(?=^.{4,}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s).*$

Как мне это сделать?
Я смотрел в Интернете, но не нашел конкретных примеров или ответов. Также, похоже, нет никаких утилит, которые могли бы сделать это автоматически.

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

+2

** Внимание: Не используйте диапазон '[Az] 'в регулярных выражениях. ** См. ответы на [этот вопрос] (http://stackoverflow.com/q/4923380/20938) для объяснения. –

+0

Да, я заметил, что во время тестирования я перешел на [A-Za-z]. Спасибо за то, что вы указали @AlanMoore :-) –

ответ

2

MySQL docs гласят:

MySQL использует реализацию Генри Спенсера регулярных выражений, который направлен на соответствие с POSIX 1003.2. MySQL использует расширенную версию для поддержки операций сопоставления шаблонов, выполняемых оператором REGEXP в операторах SQL.

Итак, мы говорим о POSIX ERE.

This page перечисляет детали между различными ароматизаторами регулярных выражений, поэтому я буду использовать его как чит-лист.


  1. ^[A-z\. ]{3,36}

    Вы используете:

    • Якоря: ^
    • классы персонажей: [ ... ]
    • Диапазон квантор: {n,m}

    Все они поддерживаются из коробки в POSIX ERE, поэтому вы можете использовать это выражение как есть. Но побега . в классе символов является избыточным, и A-z, скорее всего, неправильно в классе символов (она включает в себя [\]^_\`), так что просто написать:

    ^[A-Za-z. ]{3,36} 
    
  2. ^[a-z\d\.]{3,24}$

    Это один использует \d также, который не поддерживается в POSIX ERE.Таким образом, вы должны написать:

    ^[a-z0-9.]{3,24}$ 
    
  3. ^(?=^.{4,}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s).*$

    Мех. Вы используете lookaheads. Это полностью из сферы для POSIX ERE, но вы можете обойти это ограничение, комбинируя несколько предложений SQL для эквивалентной логики:

    WHERE LENGTH(foo) >= 4 
        AND foo REGEXP '[0-9]' 
        AND foo REGEXP '[a-z]' 
        AND foo REGEXP '[A-Z]' 
        AND NOT foo REGEXP '[ \t\r\n]' 
    
+1

за последнее вы тоже можете это сделать: 'WHERE LENGTH (foo)> 3 И foo REGEXP '^ [^ 0-9 \ t \ r \ n] * [0-9 ] [\ t \ r \ n] * $ 'И foo REGEXP' [AZ] [^ az] * [az] | [az] [^ AZ] * [AZ] '' –

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