将PCRE转换为POSIX正则表达式

时间:2015-03-09 19:58:46

标签: mysql regex pcre posix-ere

我正在开发一个MySQL数据库,并注意到它本身不支持PCRE(需要一个插件)。

我希望将这三个用于某些数据验证(这些实际上是赋予pattern属性的值):

  1. ^[A-z\. ]{3,36}
  2. ^[a-z\d\.]{3,24}$
  3. ^(?=^.{4,}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s).*$
  4. 我该怎么做?
    我在网上查看但找不到任何具体的例子或答案。似乎也没有可以自动执行此操作的实用程序。

    我知道有时候,这种转换并不准确,可能产生差异,但我愿意尝试。

1 个答案:

答案 0 :(得分:2)

MySQL docs表示:

  

MySQL使用Henry Spencer的正则表达式实现,旨在与POSIX 1003.2保持一致。 MySQL使用扩展版本来支持在SQL语句中使用REGEXP运算符执行的模式匹配操作。

好的,我们正在谈论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).*$

    咩。您正在使用前瞻。这些完全超出了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]'