首页 > 解决方案 > 正则表达式从 Javascript 到 MySQL

问题描述

我有这个 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

现在我需要在 MySQL 查询中转换它,使用REGEXP.

例如:

SELECT *
FROM table_name t
WHERE t.uri REGEXP '....'

你可以帮帮我吗?

标签: javascriptmysqlregex

解决方案


你需要

  • 将字符串文字'中的所有字符加倍'...'
  • 全部替换(?:(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})*))?$'

推荐阅读