【发布时间】:2017-10-08 02:24:59
【问题描述】:
场景:匹配除字符串“J01FA09”之外的任何以“J01”开头的字符串。
我很困惑为什么下面的代码什么都不返回:
SELECT 1
WHERE
'^J01(?!FA09).*' ~ 'J01FA10'
当我在 regexr.com 上看到它正在工作时(我意识到有不同风格的正则表达式,这可能是网站正常工作的原因)。
我已在postgres documentation 中确认,虽然支持负面展望。
表 9-15。正则表达式约束
(?!re) 否定前瞻匹配任何没有子字符串的点 匹配重新开始(仅限 ARE)。前瞻约束不能包含 反向引用(参见第 9.7.3.3 节),以及其中的所有括号 被认为是非捕获的。
【问题讨论】:
-
您不需要正则表达式。使用旧好的
LIKE和AND NOT...。 -
只是为了确定您的表中是否有任何行?因为看起来您确实写了
SELECT 1 WHERE TRUE,只要有任何行,它就应该工作 -
@Daniel,请检查我的回答。
-
右侧操作数...如此明显。我意识到我的确切示例不需要正则表达式,但这是更大图景的一部分。
-
@Xyzk 这个非常简单的例子不需要 FROM 子句或表格。它只是用来测试正则表达式
标签: regex postgresql