如何在PostgreSQL中的字符串中获取正则表达式匹配的位置?

Wobmene

我有一个包含书名的表,我想选择标题与正则表达式匹配的书,并按标题中正则表达式匹配项的位置对结果进行排序。

单字搜索很容易。例如

TABLE book
id   title
1    The Sun
2    The Dead Sun
3    Sun Kissed

.*在将查询发送到数据库之前,我将在客户的搜索词中插入单词,因此我将在此处编写带有准备好的正则表达式的SQL。

SELECT book.id, book.title FROM book
    WHERE book.title ~* '.*sun.*'
    ORDER BY COALESCE(NULLIF(position('sun' in book.title), 0), 999999) ASC;

RESULT
id   title
3    Sun Kissed
1    The Sun
2    The Dead Sun

但是,如果搜索词有多个单词,我想将标题中包含搜索词中所有单词的标题与它们之间的任何内容进行匹配,并按照之前的位置进行排序,因此我需要一个返回regexp位置的函数,在正式的PostgreSQL文档中找到合适的。

TABLE books
id   title
4    Deep Space Endeavor
5    Star Trek: Deep Space Nine: The Never Ending Sacrifice
6    Deep Black: Space Espionage and National Security

SELECT book.id, book.title FROM book
    WHERE book.title ~* '.*deep.*space.*'
    ORDER BY ???REGEXP_POSITION_FUNCTION???('.*deep.*space.*' in book.title);

DESIRED RESULT
id   title
4    Deep Space Endeavor
6    Deep Black: Space Espionage and National Security
5    Star Trek: Deep Space Nine: The Never Ending Sacrifice

我没有找到类似于??? REGEXP_POSITION_FUNCTION ???的任何功能,您有什么想法吗?

欧文·布兰德斯特

一种方法(在许多方法中):从比赛开始移除其余的字符串,并测量截断的字符串的长度:

SELECT id, title
FROM   book
WHERE  title ILIKE '%deep%space%'
ORDER  BY length(regexp_replace(title, 'deep.*space.*', '','i'));

使用ILIKEWHERE子句中,因为这是通常更快(在这里所做的一样)。
还要注意regexp_replace()函数('i'的第四个参数,以使其不区分大小写。

备择方案

根据评论中的要求。
同时说明如何首先(和匹配项进行排序NULLS LAST

SELECT id, title
      ,substring(title FROM '(?i)(^.*)deep.*space.*') AS sub1
      ,length(substring(title FROM '(?i)(^.*)deep.*space.*')) AS pos1

      ,substring(title FROM '(?i)^.*(?=deep.*space.*)') AS sub2
      ,length(substring(title FROM '(?i)^.*(?=deep.*space.*)')) AS pos2

      ,substring(title FROM '(?i)^.*(deep.*space.*)') AS sub3
      ,position((substring(title FROM '(?i)^.*(deep.*space.*)')) IN title) AS p3

      ,regexp_replace(title, 'deep.*space.*', '','i') AS reg4
      ,length(regexp_replace(title, 'deep.*space.*', '','i')) AS pos4
FROM   book
ORDER  BY title ILIKE '%deep%space%' DESC NULLS LAST
         ,length(regexp_replace(title, 'deep.*space.*', '','i'));

您可以在此处此处的手册中找到上述所有内容的文档

-> SQLfiddle演示所有内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在PostgreSQL中的字符串中获取正则表达式匹配的位置?

来自分类Dev

如何在正则表达式中以特定字符开头的字符串匹配

来自分类Dev

如何在包含某些字符的字符串中匹配正则表达式?

来自分类Dev

如何在正则表达式的MongoDB中搜索与给定字符串的匹配?

来自分类Dev

如何在正则表达式匹配项中替换字符串

来自分类Dev

如何在JavaScript字符串替换中负匹配正则表达式?

来自分类Dev

如何在Java中返回与正则表达式匹配的字符串

来自分类Dev

如何在字符串中搜索正则表达式模式的重叠匹配

来自分类Dev

如何在bash中匹配以下字符串的正则表达式?

来自分类Dev

如何在bash中匹配以下字符串的正则表达式?

来自分类Dev

如何在正则表达式中匹配字符串的开头/结尾?

来自分类Dev

如何在正则表达式中匹配字符串后跟重复模式?

来自分类Dev

如何在此正则表达式中限制字符串的初始位置?

来自分类Dev

如何在正则表达式中获取字符串并在匹配字符串后删除其他字符串

来自分类Dev

如何在C ++中获取正则表达式的基础字符串?

来自分类Dev

如何在正则表达式的冷融合中获取特定字符串的值

来自分类Dev

如何正则表达式匹配和正则表达式替换php中的字符串

来自分类Dev

正则表达式:尝试多次匹配字符串中任何位置的前缀

来自分类Dev

Vim正则表达式搜索:更改光标在匹配字符串中的位置

来自分类Dev

使用正则表达式和JavaScript获取字符串中的完全匹配

来自分类Dev

如果找到匹配的正则表达式,则从字符串中获取值

来自分类Dev

使用正则表达式和JavaScript获取字符串中的完全匹配

来自分类Dev

在正则表达式中获取匹配字符串的索引

来自分类Dev

使用 Gsub 获取 R 中匹配的字符串 - 正则表达式

来自分类Dev

如何在正则表达式中匹配字符串,特殊字符和HTML标签?

来自分类Dev

如何在此正则表达式匹配项中忽略引号中的字符串?

来自分类Dev

如何用正则表达式匹配字符串中的中间字符?

来自分类Dev

如何计算与给定正则表达式匹配的字符串中的字符

来自分类Dev

如何使用正则表达式匹配单引号或双引号中的字符串

Related 相关文章

  1. 1

    如何在PostgreSQL中的字符串中获取正则表达式匹配的位置?

  2. 2

    如何在正则表达式中以特定字符开头的字符串匹配

  3. 3

    如何在包含某些字符的字符串中匹配正则表达式?

  4. 4

    如何在正则表达式的MongoDB中搜索与给定字符串的匹配?

  5. 5

    如何在正则表达式匹配项中替换字符串

  6. 6

    如何在JavaScript字符串替换中负匹配正则表达式?

  7. 7

    如何在Java中返回与正则表达式匹配的字符串

  8. 8

    如何在字符串中搜索正则表达式模式的重叠匹配

  9. 9

    如何在bash中匹配以下字符串的正则表达式?

  10. 10

    如何在bash中匹配以下字符串的正则表达式?

  11. 11

    如何在正则表达式中匹配字符串的开头/结尾?

  12. 12

    如何在正则表达式中匹配字符串后跟重复模式?

  13. 13

    如何在此正则表达式中限制字符串的初始位置?

  14. 14

    如何在正则表达式中获取字符串并在匹配字符串后删除其他字符串

  15. 15

    如何在C ++中获取正则表达式的基础字符串?

  16. 16

    如何在正则表达式的冷融合中获取特定字符串的值

  17. 17

    如何正则表达式匹配和正则表达式替换php中的字符串

  18. 18

    正则表达式:尝试多次匹配字符串中任何位置的前缀

  19. 19

    Vim正则表达式搜索:更改光标在匹配字符串中的位置

  20. 20

    使用正则表达式和JavaScript获取字符串中的完全匹配

  21. 21

    如果找到匹配的正则表达式,则从字符串中获取值

  22. 22

    使用正则表达式和JavaScript获取字符串中的完全匹配

  23. 23

    在正则表达式中获取匹配字符串的索引

  24. 24

    使用 Gsub 获取 R 中匹配的字符串 - 正则表达式

  25. 25

    如何在正则表达式中匹配字符串,特殊字符和HTML标签?

  26. 26

    如何在此正则表达式匹配项中忽略引号中的字符串?

  27. 27

    如何用正则表达式匹配字符串中的中间字符?

  28. 28

    如何计算与给定正则表达式匹配的字符串中的字符

  29. 29

    如何使用正则表达式匹配单引号或双引号中的字符串

热门标签

归档