javascript - 正则表达式从 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 '....'
你可以帮帮我吗?
解决方案
你需要
- 将字符串文字
'
中的所有字符加倍'...'
- 全部替换
(?:
为(
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})*))?$'
推荐阅读
- sql - 基本的 oracle 程序不运行
- reactjs - 从 material-ui/lab 导入 LoadingButton 失败
- java - 我可以将一个 DTO 用于不同的 UI 组件,这些组件必须以不同的表示形式但来自相同的字段显示一个实体?
- sequelize.js - SequelizeJS 和排序,包含问题
- python - Django 在管理面板中查看所有用户信息
- java - 从驱动程序/作业中提取 Talend 组件
- data-analysis - 如何在 excel 中缩放 2 个不同范围的数据?
- mongodb - MongoDB Spring Data 在类异常中找不到属性“$$value”
- r - r中时间序列的合适预测方法
- html - 通过谷歌找到时如何在 URL 末尾添加 .html