我的正则表达式不正确如何改变这个?

时间:2014-06-03 10:39:00

标签: sql regex postgresql

我有一个小字符串:

JIW.sql;XXX.txt;Qwij.DLL;saasa.sql;ttt.txt;lok.SQL;ddd.jpg;aas.sql

我需要像这样选择

SELECT regexp_split_to_table('JIW.sql;XXX.txt;Qwij.DLL;saasa.sql;ttt.txt;lok.SQL;ddd.jpg;aas.sql', '[0-9A-z]*.sql');

我希望:

JIW.sql
saasa.sql
lok.SQL
aas.sql

但现在我有

---------------------------

;XXX.txt;Qwij.DLL;
;ttt.txt;lok.SQL;ddd.jpg;

(4 rows)

如何更改?

4 个答案:

答案 0 :(得分:1)

您正在使用regexp_split_to_table功能,当您的字符串与模式匹配时拆分

您使用regex_matches查找正则表达式模式的匹配项:

SELECT 
  regexp_matches(
    'JIW.sql;XXX.txt;Qwij.DLL;saasa.sql;ttt.txt;lok.SQL;ddd.jpg;aas.sql',
    E'([^;]+\.sql)',
    'gi'
  );

其中,gi参数是全局不区分大小写搜索的修饰符。结果将是like this

您还可以使用unnest功能获取result returned as rows instead。然后查询将是:

SELECT 
  unnest(
    regexp_matches(
      'JIW.sql;XXX.txt;Qwij.DLL;saasa.sql;ttt.txt;lok.SQL;ddd.jpg;aas.sql',
      E'([^;]+\.sql)',
      'gi'
    )
  );

答案 1 :(得分:1)

我认为你在寻找:

SELECT regexp_matches('JIW.sql;XXX.txt;Qwij.DLL;saasa.sql;ttt.txt;lok.SQL;ddd.jpg;aas.sql', '[0-9A-z]*.sql', 'g');

而不是ie。 regexp_matches 而不是 regexp_split_to_table

答案 2 :(得分:0)

我从未见过regexp_split_to_table,但基于快速Google搜索(以及操作名称),我猜你给它的模式是分隔符模式。换句话说,返回的将是之间的值与模式匹配的字符串,以及将从结果中删除模式的匹配项。

如果你给了';"作为一种模式,它会产生

JIW.sql
XXX.txt
Qwij.DLL
saasa.sql
ttt.txt
lok.SQL
ddd.jpg
aas.sql

我不确定分裂是你正在尝试做的事情。

答案 3 :(得分:0)

如果您真的想使用regexp_split_to_table,请尝试使用:

SELECT result.filename FROM
  (SELECT regexp_split_to_table('JIW.sql;XXX.txt;Qwij.DLL;saasa.sql;ttt.txt;lok.SQL;ddd.jpg;aas.sql', ';') AS filename) result
 WHERE result.filename ILIKE '%.sql'

输出:

"JIW.sql"
"saasa.sql"
"lok.SQL"
"aas.sql"