我正在尝试使用正则表达式检测表格中所有行中的网址,这是正则表达式
\b(([\w-]+:\/\/?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/)))
然而,我总是得到“重复 - 操作员操作数无效”错误,在互联网上搜索数小时之后仍然是模糊不清的。 我哪里出错了?我该怎么做才能解决这个问题?而且,除了正则表达式之外,还有一种更好的方法来检测SQL中消息中的URL吗?
谢谢。
答案 0 :(得分:1)
您不能在MySQL regex中使用?
量词,因为语法是基于POSIX的。不过,您仍然可以使用*
来匹配0个或更多字符。此外,MySQL正则表达式中的\b
应替换为[[:<:]]
(因为它匹配单词的开头)。
因此,我建议使用
[[:<:]](([a-zA-Z0-9-]+:\/\/*|www[.])[^ ()<>]+(\([a-zA-Z0-9_]+\)|([^ [:punct:]]|\/)))
我正在将\w
扩展为[a-zA-Z0-9_]
,因为它正是\w
。而不是\s
,我使用的是文字空间。我使用\d
而不是[0-9]
。这样做是为了提高可读性和兼容性。如果\w
,\d
和\s
适合您,您可以使用它们,但我不会在POSIX specs中支持的实体中看到它们。
此外,您可以使用[:space:]
代替文字空间,它匹配空格,制表符,换行符和回车符。您可以使用[a-zA-Z]
代替[:alpha:]
,而不是[0-9]
,而不是[:digit:]
。另请查看:
[[:<:]](([[:alpha:][:digit:]-]+:\/\/*|www[.])[^[:space:]()<>]+(\([[:alpha:][:digit:]_]+\)|([^[:space:][:punct:]]|\/)))