【问题标题】:Regex to SQL: repetition-operator operand invalid正则表达式到 SQL:重复运算符操作数无效
【发布时间】:2015-08-06 19:53:07
【问题描述】:

我正在尝试使用正则表达式来检测表中所有行中的 URL,这是正则表达式

\b(([\w-]+:\/\/?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/)))

但是,我总是收到“repetition-operator operand invalid”错误,在互联网上搜索了数小时后,仍然不为人知。 我哪里出错了?我能做些什么来解决这个问题?或者,除了 Regex 之外,还有没有更好的方法来检测 SQL 消息中的 URL?

谢谢。

【问题讨论】:

  • Regexp to validate URL in MySQL 怎么样?它回答了你的问题吗?
  • @stribizhev 我可能需要更复杂的正则表达式,否则不会检测到所有 URL。上面的那个对我很有效,如果我能帮上忙,我想继续使用它。
  • @stribizhev 得到这个重复错误。至于你建议的正则表达式,我试过了,它只检测到我的一小部分网址。
  • 看起来问题在于使用 ? 量词,*?+? 不能在 MySQL 正则表达式中使用。此外,不确定非捕获组,将它们替换为捕获组。请使用[[:&lt;:]](([a-zA-Z0-9-]+:\/\/*|www[.])[^ ()&lt;&gt;]+(\([a-zA-Z0-9_]+\)|([^ [:punct:]]|\/)))重试。
  • @stribizhev 这行得通。但结果只是略有改善。你确定正则表达式根本没有改变吗? (这种新语法让我感到困惑)

标签: mysql sql regex


【解决方案1】:

您不能在 MySQL regex 中使用 ? 量词,因为语法是基于 POSIX 的。不过,您可以使用 * 匹配 0 个或多个字符。此外,MySQL 正则表达式中的\b 应替换为[[:&lt;:]](因为它匹配单词的开头)。

因此,我建议使用

[[:<:]](([a-zA-Z0-9-]+:\/\/*|www[.])[^ ()<>]+(\([a-zA-Z0-9_]+\)|([^ [:punct:]]|\/)))

我将\w 扩展为[a-zA-Z0-9_],因为这正是\w 的含义。我使用的是文字空间,而不是 \s。我使用的是[0-9],而不是\d。这样做是为了可读性和更好的兼容性。如果\w\d\s 为您工作,您可以使用它们,但我在POSIX specs 支持的实体中看不到它们。

另外,您可以使用[:space:] 代替文字空格,它匹配空格、制表符、换行符和回车。你可以用[:alpha:]代替[a-zA-Z],你可以用[:digit:]代替[0-9]。另请检查:

[[:<:]](([[:alpha:][:digit:]-]+:\/\/*|www[.])[^[:space:]()<>]+(\([[:alpha:][:digit:]_]+\)|([^[:space:][:punct:]]|\/)))

【讨论】:

  • 这次运行完美。我会确保通读您的答案,以免卡住两次。非常感谢。祝你有美好的一天。
  • 不客气。顺便说一句,我刚刚找到了一个匹配正则表达式here 的 URL,并尝试为您调整它:[[:&lt;:]](https*://)*[a-zA-Z0-9_]+\.(\.*[a-zA-Z0-9_]+)+。不知道它是否效果更好。
猜你喜欢
  • 2016-09-09
  • 2013-08-21
  • 2013-02-27
  • 2019-12-11
  • 2014-05-04
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 2013-03-10
相关资源
最近更新 更多