好吧,我认为我的头部受到常规正则表达式的伤害,但我似乎无法在mysql中使用regexp找到我正在寻找的内容。
我正在尝试查找新闻文章中的情况,其中一个纺织品格式的网址没有以斜线结束:
“Catherine Zeta-Jones”:/ cr / catherinezeta-jones / visit stack overflow is ok but “Catherine Zeta-Jones”:/ cr / catherinezeta-jones访问堆栈溢出不是。
[只是用凯瑟琳作为例子因为我假设字母搜索不能捕捉连字符]
有一天我将不得不做那种山羊牺牲,这样我才能获得正则表达式的正确知识。
谢谢大家!
答案 0 :(得分:1)
我认为你最终会得到以下正则表达式:"((?:[^"]|\\")*)":(\S*/)(?=\s)
。打破这个:
"
符合文字引用。[^"]
,非引号字符或\\"
,一条逃脱的报价。"
符合文字引用。:
匹配字面冒号。\S*
匹配零个或多个非空白字符/
匹配文字斜杠(?=\s)
是预测,如果 next 字符是任何空白字符,则匹配。此后,第一个捕获组(通常为$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。你应该使用解析器,或者沿着这些线。根据你为什么这样做,这可能是可能的。