正则表达式url块指定了单词AND优化

时间:2013-07-10 14:07:38

标签: regex postgresql

简化代码:

SELECT 'ok' WHERE '/articles/new/' ~ '^/articles/(?!new)([\w-]+)/$';

I / o示例,我想要的:

'/articles/new/' => ''
'/articles/new-york/' => 'ok'
'/articles/other-string/' => 'ok'

而且,错了:

'/articles/new/' => ''
'/articles/new-york/' => '' /* Wrong */
'/articles/other-string/' => 'ok'

那么,我可以阻止这个词吗?

优化

在PostgreSQL数据库中,我有一个表(page),它有列path, title, file, regex_path etc.

path中的数据如下所示:

/
/articles/
/articles/:category-code/
/articles/:category-code/:article-code/
/articles/:category-code/:article-code/edit/
/articles/new/
/members/
/members/:username/

:表示它是一个参数(PHP获取基于regex_path的名称和内容 - frist版本)

从外部(PHP)数据库获取值(URL);示例:

/ /* Main page */
/articles/ /* List all article */
/articles/it/ /* List articles in IT category */
/articles/it/ipad-mini-2/  /* Article */
/articles/it/ipad-mini-2/edit/ /* Edit article */
/articles/new/ /* New article */
/members/ /* Member list */
/members/someone/ /* Member datasheet */

如何选择正确的行,其中值(URL)与路径“匹配”(最快的方式,没有正则表达式)?

实施例

在: /articles/it/ipad-mini-2/

Out: path所在的行:/articles/:category-code/:article-code/

2 个答案:

答案 0 :(得分:3)

这更快:

SELECT *
FROM   tbl 
WHERE  txt LIKE '/articles/%'
AND    txt <>   '/articles/new/'  -- only exclude this exact string

或者,取决于您的实际需要:

...
AND    txt !~~  '/articles/new/%'; -- exclude the whole branch

由于正则表达式通常更贵,因此LIKE=<>
使用EXPLAIN ANALYZE进行测试。

{p> !~~ .. NOT LIKE的运算符。

测试

我进行了测试以确认我的主张。它比正则表达式快9倍。

'^/articles(?!/new/)/([\w-]+)/$'

..应该简化为(快一点):

'^/articles/(?!new/)[\w-]+/$'

->SQLfiddle

答案 1 :(得分:1)

你很亲密,我改变了否定的前瞻性更具体。仅当前瞻发现/new/时,它才能匹配。

^/articles(?!/new/)/([\w-]+)/$

结果

/articles/new
/articles/new/
/articles/new-york/ => OK
/articles/other-string/ => OK
/articles/notnew/ => OK

测试在这里:

REY