场景:匹配任何以" J01"开头的字符串;除了字符串" J01FA09"。
我感到困惑,为什么以下代码什么都不返回:
SELECT 1
WHERE
'^J01(?!FA09).*' ~ 'J01FA10'
当我在regexr.com上看到它正在工作时(我发现有不同版本的正则表达式,这可能是网站工作的原因)。
我已在postgres documentation中确认支持负面展望。
表9-15。正则表达式约束
(?!re)负向前瞻匹配任何没有子串的点 匹配重新开始(仅限ARE)。前瞻约束不能包含 返回引用(参见第9.7.3.3节)及其中的所有括号 被认为是非捕获。
答案 0 :(得分:2)
匹配以“J01”开头的任何字符串,但字符串“J01FA09”除外。
使用
可以不使用正则表达式LIKE 'J01%'
此处,J01
要求字符串以s != 'J01FA09'
开头,之后可能会有任何字符,WHERE s ~ '^J01(?!FA09$)'
会过滤掉匹配项。
如果您想使用正则表达式进行相同操作,请使用
^
J01
匹配字符串的开头,J01
匹配文字(?!FA09$)
子字符串,而J01
在FA09
之后没有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>
答案 1 :(得分:1)
RE是右侧操作数:
SELECT 1
WHERE 'J01FA10' ~ '^J01(?!FA09)';
?column?
----------
1
(1 row)