【问题标题】:Converting PCRE to POSIX regular expression将 PCRE 转换为 POSIX 正则表达式
【发布时间】:2015-03-09 19:58:46
【问题描述】:

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

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

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

我该怎么做?
我在网上查看,但找不到任何具体的例子或答案。此外,似乎不存在可以自动执行此操作的实用程序。

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

【问题讨论】:

  • 警告:不要在正则表达式中使用范围[A-z]请参阅this question 的答案以获取解释。
  • 是的,我在测试期间注意到了这一点,所以我改为 [A-Za-z]。感谢您指出@AlanMoore :-)

标签: mysql regex pcre posix-ere


【解决方案1】:

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]'
    

【讨论】:

  • 最后你也可以这样做:WHERE LENGTH(foo)>3 AND foo REGEXP '^[^0-9 \t\r\n]*[0-9][ \t\r\n]*$' AND foo REGEXP '[A-Z][^a-z]*[a-z]|[a-z][^A-Z]*[A-Z]'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多