将 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 docs 声明:
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 ERE。
This page 列出了各种正则表达式风格之间的详细信息,因此我将其用作备忘单。
^[A-z\. ]{3,36}
您正在使用:
- 锚:
^
- 字符 classes:
[
...]
- 范围量词:
{n,m}
所有这些都在 POSIX ERE 中开箱即用,因此您可以按原样使用此表达式。 但是 转义字符 class 中的 .
是多余的,而 A-z
很可能是字符 class 中的错误(它包括[\]^_\`
), 所以只写:
^[A-Za-z. ]{3,36}
^[a-z\d\.]{3,24}$
这个也使用 \d
,POSIX ERE 不支持。所以你必须写:
^[a-z0-9.]{3,24}$
^(?=^.{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]'
我正在处理 MySQL 数据库,发现它本身不支持 PCRE(需要插件)。
我希望将这三个用于一些数据验证(这些实际上是赋予 pattern
属性的值):
^[A-z\. ]{3,36}
^[a-z\d\.]{3,24}$
^(?=^.{4,}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s).*$
我该怎么做?
我在网上查看但找不到任何具体示例或答案。此外,似乎不存在可以自动执行此操作的实用程序。
我知道有时候这样的转换并不准确,会产生差异,但我愿意尝试。
MySQL docs 声明:
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 ERE。
This page 列出了各种正则表达式风格之间的详细信息,因此我将其用作备忘单。
^[A-z\. ]{3,36}
您正在使用:
- 锚:
^
- 字符 classes:
[
...]
- 范围量词:
{n,m}
所有这些都在 POSIX ERE 中开箱即用,因此您可以按原样使用此表达式。 但是 转义字符 class 中的
.
是多余的,而A-z
很可能是字符 class 中的错误(它包括[\]^_\`
), 所以只写:^[A-Za-z. ]{3,36}
- 锚:
^[a-z\d\.]{3,24}$
这个也使用
\d
,POSIX ERE 不支持。所以你必须写:^[a-z0-9.]{3,24}$
^(?=^.{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]'