Postgres正则表达式否定前瞻

时间:2017-05-09 16:44:23

标签: regex postgresql

场景:匹配任何以" J01"开头的字符串;除了字符串" J01FA09"。

我感到困惑,为什么以下代码什么都不返回:

SELECT 1
WHERE
    '^J01(?!FA09).*' ~ 'J01FA10'

当我在regexr.com上看到它正在工作时(我发现有不同版本的正则表达式,这可能是网站工作的原因)。

我已在postgres documentation中确认支持负面展望。

表9-15。正则表达式约束

  

(?!re)负向前瞻匹配任何没有子串的点   匹配重新开始(仅限ARE)。前瞻约束不能包含   返回引用(参见第9.7.3.3节)及其中的所有括号   被认为是非捕获。

2 个答案:

答案 0 :(得分:2)

  

匹配以“J01”开头的任何字符串,但字符串“J01FA09”除外。

使用

可以不使用正则表达式
LIKE 'J01%'

此处,J01要求字符串以s != 'J01FA09'开头,之后可能会有任何字符,WHERE s ~ '^J01(?!FA09$)' 会过滤掉匹配项。

如果您想使用正则表达式进行相同操作,请使用

^

J01匹配字符串的开头,J01匹配文字(?!FA09$)子字符串,而J01FA09之后没有FA09断言1}}后跟字符串位置的结尾。如果CREATE TABLE table1 (s character varying) ; INSERT INTO table1 (s) VALUES ('J01NNN'), ('J01FFF'), ('J01FA09'), ('J02FA09') ; SELECT * FROM table1 WHERE s ~ '^J01(?!FA09$)'; SELECT * FROM table1 WHERE s LIKE 'J01%' AND s != 'J01FA09'; 出现并且后面有字符串结尾,则不会返回匹配项。

请参阅online demo

<td>

enter image description here

答案 1 :(得分:1)

RE是右侧操作数:

SELECT 1
WHERE 'J01FA10' ~ '^J01(?!FA09)';

 ?column? 
----------
        1
(1 row)