【问题标题】:Verify if a regex is Posix compatible验证正则表达式是否与 Posix 兼容
【发布时间】:2020-04-22 23:55:47
【问题描述】:

我想知道是否有办法使用 Java 验证正则表达式是否与 Posix 兼容。

我正在使用 MySQL 5.7 版本和 I can't use“普通”正则表达式和 REGEXP 函数:

MySQL 使用 Henry Spencer 的正则表达式实现,旨在符合 POSIX 1003.2。 MySQL 使用扩展版本支持 SQL 语句中的正则表达式模式匹配操作。

如果我尝试使用其中一些令牌,例如:

  • \w
  • \d
  • (?:

它们被认为是无效的或被 MySQL 忽略。可能还有其他的。

我知道 Java Pattern 类可用于验证正则表达式是否有效:

Pattern.compile(regex);

如果正则表达式无效,则返回异常。但是,正如我所说,我正在尝试验证正则表达式是否仅与 Posix 兼容,因此我可以在将信息保存到数据库之前验证正则表达式输入。

【问题讨论】:

  • Java 不是一种解释性语言,而且几乎可以肯定它是完成这项工作的错误工具。您可能会发现这个Comparison of regular-expression engines 很有用。但也许不是,我不知道有任何现成的方法来验证正则表达式是否与 posix 兼容。主要是因为大多数工具都试图优雅地失败。如果您告诉我们您想要哪个 posix 标准,这也可能会有所帮助。我不知道他们上次在 Posix 中更新正则表达式是什么时候。但他们最后一次更新 Posix 是在 2017 年。

标签: java mysql regex posix mysql-5.7


【解决方案1】:

在 Perl 兼容的正则表达式 (PCRE) 中支持 \w\d(?:) 等语法,但在 POSIX 中不支持。 egrep 之类的工具支持增强的兼容性功能,但这并不能使它们成为 POSIX。

来自 re_format(7) 的手册页:

增强功能

将 REG_ENHANCED 标志传递给 regcomp() 变体之一时,会激活其他功能。就像 perl(1) 和 python(1) 等脚本语言中增强的正则表达式实现一样,这些附加功能可能在某些方面与 IEEE Std 1003.2 (``POSIX.2'') 标准冲突。在需要可移植性的情况下(包括使用以前的正则表达式实现的 Mac OS X 的过去版本)小心使用它。

“扩展”和“增强”之间存在区别。扩展是指 POSIX 正则表达式功能的级别。增强是指 PCRE 支持但 POSIX 不支持的语法。

你可以用 POSIX 语法做很多你想做的事情:

  • 对于\w,使用[[:alnum:]_]

  • 对于\d,使用[[:digit:]]

  • (?:) 语法是不必要的,因为 MySQL REGEXP 无论如何都不支持捕获组。您可以简单地使用() 进行分组。

我认为没有必要使用 Java 验证器来解析您的正则表达式。您应该能够阅读文档并仅使用该文档中出现的功能。

我的意思是,真的,正则表达式语法并不复杂。您可以在便利贴上创建一个快速参考表。

【讨论】:

    猜你喜欢
    • 2016-02-02
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    相关资源
    最近更新 更多