关于mysql:将PCRE转换为POSIX正则表达式

Converting PCRE to POSIX regular expression

我正在研究一个MySQL数据库,发现它本身不支持PCRE(需要一个插件)。

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

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

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


    "mysql文档的状态是: P / < >

    MySQL uses Henry Spencer's implementation of regular expressions, which is aimed at conformance with POSIX 1003.2. MySQL uses the extended version to support pattern-matching operations performed with the REGEXP operator in SQL statements.

    好的,所以我们说点关于posix这个。 P / < >

    本页列出的细节之间的各种regex flavors,所以我会用它作为cheatsheet。 P / < >

  • ^[A-z\. ]{3,36} P / < >

    你在用: P / < >

    • anchors:^
    • 字符类:[...]
    • 烃类quantifier:{n,m}

    所有这些都是supported出箱在posix的家,所以你可以使用这个expression三也。但escaping的.在字符类也redundant,和A-z现在可能在错误的字符类(它includes [\]^_\`),所以就写: P / < >

    1
    ^[A-Za-z. ]{3,36}
  • ^[a-z\d\.]{3,24}$ P / < >

    这一用途的\d好的年代,这是unsupported在posix这个。所以你要写: P / < >

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

    不,不是我的。你是用lookaheads。这些都是完全从英语scope为posix这个,但你可以工作在这样的限制,由combining several SQL clauses为一个konizit逻辑: P / < >

    1
    2
    3
    4
    5
    6
    7
    WHERE LENGTH(foo) >= 4
      AND foo REGEXP '[0-9]'
      AND foo REGEXP '[a-z]'
      AND foo REGEXP '[A-Z]'
      AND NOT foo REGEXP '[ \t

    ]'