java - 验证正则表达式是否与 Posix 兼容
问题描述
我想知道是否有办法使用 Java 验证正则表达式是否与 Posix 兼容。
我使用的是 MySQL 5.7 版本,我不能在函数中使用“普通”正则表达式REGEXP
:
MySQL 使用 Henry Spencer 的正则表达式实现,旨在符合 POSIX 1003.2。MySQL 使用扩展版本支持 SQL 语句中的正则表达式模式匹配操作。
如果我尝试使用其中一些令牌,例如:
\w
\d
(?:
它们被认为是无效的或被 MySQL 忽略。可能还有其他的。
我知道 JavaPattern
类可用于验证正则表达式是否有效,使用:
Pattern.compile(regex);
如果正则表达式无效,则返回异常。但是,正如我所说,我正在尝试验证正则表达式是否仅与 Posix 兼容,因此我可以在将信息保存到数据库之前验证正则表达式输入。
解决方案
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:]]
。(?:)
语法是不必要的,因为 MySQLREGEXP
不支持捕获组。您可以简单地()
用于分组。
我认为没有必要使用 Java 验证器来解析您的正则表达式。您应该能够阅读文档并仅使用该文档中出现的功能。
我的意思是,真的,正则表达式语法并不复杂。您可以在便利贴上创建一个快速参考表。
推荐阅读
- python - 描述符装饰器究竟是如何被调用的?
- asp.net - 如何从视图调用我自己的 API?ASP.NET MVC
- javascript - Javascript 正则表达式来捕获括号之间的每一个可能的数学运算
- javascript - 服务器发送事件 + Asp Core,为什么我不能让它工作?
- javascript - 通过 id 和 jquery 引用附加的 HTML 代码
- c# - 在 .NET Core 3.1 中使用 EC (ECDH_ES_A256KW, A256GCM) 进行 JWE 加密/解密
- dialogflow-es - 从主对话框访问后续意图
- python - 在 Windows 10 上检测 USB 输入设备的插入/移除
- java - 什么时候不使用 java8 流?
- python - 在 x 轴上更改 Seaborn 线图中的刻度粒度