正则表达式搜索mysql文本列

时间:2010-05-28 02:56:39

标签: mysql regex

好吧,我认为我的头部受到常规正则表达式的伤害,但我似乎无法在mysql中使用regexp找到我正在寻找的内容。

我正在尝试查找新闻文章中的情况,其中一个纺织品格式的网址没有以斜线结束:

“Catherine Zeta-Jones”:/ cr / catherinezeta-jones / visit stack overflow is ok but “Catherine Zeta-Jones”:/ cr / catherinezeta-jones访问堆栈溢出不是。

[只是用凯瑟琳作为例子因为我假设字母搜索不能捕捉连字符]

有一天我将不得不做那种山羊牺牲,这样我才能获得正则表达式的正确知识。

谢谢大家!

1 个答案:

答案 0 :(得分:1)

我认为你最终会得到以下正则表达式:"((?:[^"]|\\")*)":(\S*/)(?=\s)。打破这个:

  1. "符合文字引用。
  2. `(?:[^“] | \”)*匹配(不捕获)内部;也就是说,任何数字(零个或多个):
    • [^"],非引号字符或
    • \\",一条逃脱的报价。
  3. "符合文字引用。
  4. :匹配字面冒号。
  5. \S*匹配零个或多个非空白字符
  6. /匹配文字斜杠
  7. (?=\s)是预测,如果 next 字符是任何空白字符,则匹配。
  8. 此后,第一个捕获组(通常为$1)将包含链接文本,$2将包含链接URL。它只匹配您想要的格式的链接。如果您要匹配所有链接,只需删除/,然后删除所有不以一个结尾的网址。


    编辑:据我所知,MySQL没有\s\S(?:...)或(?=...),显然。替换\s\S很简单:只需使用[[:blank:]][^[:blank:]]即可。替换(?:...)也很容易,因为我想在这种情况下,您不关心哪些组捕获了什么:只需用(?:...)替换所有(...)。一般来说,替换前瞻是很棘手的,但在这种情况下应该是可能的:据我所知,你实际上并不关心最后的空间是否包含在匹配中。因此,您可以匹配您想要展望的内容,而不是简单地向前看它(或者我在第一个答案中遗漏的字符串结尾$)。为了稍微改进一下,这里有两个regexen:

    • "(([^"]|\\")*)":([^[:space:]]*/)([[:space:]]|$),它匹配以斜线结尾的纺织品网址;或
    • [编辑:已损坏!] "(([^"]|\\")*)":([^[:space:]]*[^/])([[:space:]]|$),与以斜线结尾的纺织品网址相匹配。

    编辑:我上次几乎的工作。但是,请考虑"text":/url/之类的内容。 [^[:space:]]*会抓住/url/[^/]会抓住第一个空格,而([[:space:]]|$)会抓住第二个空格,因此会告诉您它不匹配。为了解决这个问题,我们告诉它URL的最后一个字符必须是非空格字符。这样做,并删除一些冗余的括号,给我们

    • "([^"]|\\")*":[^[:space:]]*/([[:space:]]|$),它匹配以斜线结尾的纺织品网址;或
    • "([^"]|\\")*":[^[:space:]]*[^/[:space:]]([[:space:]]|$),与以斜线结尾的纺织品网址相匹配。

    这几乎足够好了。但是,它并不完全。虽然诸如,之类的标点符号在URL中在技术上是合法的,但Textile不允许使用它。但是,它关于何时结束URL的规则相当模糊:"common punctuation … can reside at the end of a URL."此外,还可以将方括号中的链接括起来,这个正则表达式也不会捕获。而这甚至没有开始处理链接查找表。

    修改处理,案例的事情很简单:在您看到[:space:]的任何地方,将其替换为[:space:],,并在,之后添加您需要的任何内容。这是因为在上述regexen中,[:space:]代表“非法URL字符”。修改处理括号的事情更难,但最好通过像逗号一样处理]来实现。此正则表达式无法处理链接查找表。有可能使用(未经测试的)^[[:space:]]*\[[^\]]*\].*[^/]$的正则表达式,但我几乎肯定会错过极端情况(要么太多,太少,要么两者都有),而且可能有错误它自己的。您当然无法知道是否只使用regexen来定义已定义的链接。

    然后,这最后一个复杂问题开启了另一个问题:你究竟在做什么?我现在知道你正在做SELECT ... WHERE ...,但这是为了什么?我问的原因是这个任务不再适合regexen。你应该使用解析器,或者沿着这些线。根据你为什么这样做,这可能是可能的。