我想知道是否有一种方法可以验证正则表达式是否使用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兼容,因此我可以在将信息保存到数据库之前验证正则表达式的输入。
与\w
,\d
,(?:)
相似的语法在Perl兼容的正则表达式(PCRE)中受支持,而在POSIX中不受支持。诸如egrep
之类的工具都支持增强的兼容性功能,但这并不能使其成为POSIX。
来自re_format(7)的手册页:
增强功能
当将REG_ENHANCED标志传递给regcomp()变体之一时,将激活其他功能。像perl(1)和python(1)等脚本语言中的增强型正则表达式实现一样,这些其他功能可能在某些方面与IEEE Std 1003.2(``POSIX.2'')标准冲突。在需要可移植性的情况下(包括使用以前的正则表达式实现的Mac OS X的早期版本),请谨慎使用此选项。
对于\w
,请使用[[:alnum:]_]
。
对于\d
,请使用[[:digit:]]
。
(?:)
语法是不必要的,因为MySQL REGEXP
仍然不支持捕获组。您可以简单地使用()
进行分组。