我有这个 javascript 正则表达式来检查 URI 是否有效 (RFC 3986):
/^(https?):\/\/((?:[a-z0-9.-]|%[0-9A-F]{2}){3,})(?::(\d+))?((?:\/(?:[a-z0-9-._~!$&'()*+,;=:@]|%[0-9A-F]{2})*)*)(?:\?((?:[a-z0-9-._~!$&'()*+,;=:\/?@]|%[0-9A-F]{2})*))?(?:#((?:[a-z0-9-._~!$&'()*+,;=:\/?@]|%[0-9A-F]{2})*))?$/i
现在我需要使用 REGEXP
在 MySQL 查询中转换它。
例如:
SELECT *
FROM table_name t
WHERE t.uri REGEXP '....'
你能帮帮我吗?
最佳答案
你需要
- 将
'...'
字符串文字中的所有'
字符加倍 - 将所有
(?:
替换为(
,因为 MySQL 遗留版本使用不支持非捕获组的 POSIX 兼容正则表达式引擎 - 一定要删除第一个
/
和最后一个/i
因为模式在 MySQL 中作为字符串传递,而不是正则表达式文字,并且模式不区分大小写默认情况下,无需在任何地方添加i
(或手动添加A-Z
,以防某些全局设置被覆盖) - 将所有
\/
替换为/
以保持正则表达式干净 - 将
\d
替换为[0-9]
(同样,POSIX 不支持简写字符类,尽管您也可以使用 POSIX 字符类,例如[[:digit:]]
匹配任何数字) - 最有可能的是,将
\?
替换为\\?
,或者只使用[?]
来匹配文字?
符号 - 始终在字符类的结尾或开头使用文字连字符(POSIX 正则表达式中的括号表达式)。
使用
WHERE t.uri REGEXP '^https?://(([A-Za-z0-9.-]|%[0-9A-Fa-f]{2}){3,})(:[0-9]+)?((/([A-Za-z0-9._~!$&''()*+,;=:@-]|%[0-9A-Fa-f]{2})*)*)([?](([A-Za-z0-9._~!$&''()*+,;=:/?@-]|%[0-9a-fA-F]{2})*))?(#(([A-Za-z0-9._~!$&''()*+,;=:/?@-]|%[0-9A-Fa-f]{2})*))?$'
关于javascript - 从 Javascript 到 MySQL 的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59086358/