我想在Firebird中使用类似于表达式的(^|\s)1001(\s|$)
之类的正则表达式:
示例:
abc 1001 abc
-是abc 121001 abc
-错误1001 abc
-是121001
-错误abc 1001
-是我尝试将其转换为Firebird中的正则表达式:
COLUMN与(^|[:WHITESPACE:])abc 1001 abc($|[:WHITESPACE:])
类似,但是^
(行的开头)和$
(行的结尾)不起作用,查询以以下结尾:
无效的类似TO模式异常。
我在https://firebirdsql.org/refdocs/langrefupd25-similar-to.html的Firebird文档中找不到关于行首和行尾的任何内容
答案 0 :(得分:2)
摘自《 Firebird 2.5语言参考》,SIMILAR TO
documentation:
SIMILAR TO将字符串与SQL正则表达式模式匹配。 与其他语言不同,该模式必须与整个 字符串才能成功-匹配子字符串是不够的。
换句话说,正则表达式是多行的,并且-在给定链接的文档中-不提供开始/结束锚,因为已经暗示了它们(但是整个字符串而不是每行),因为不支持部分匹配。
Firebird中的正则表达式实现符合SQL标准,该标准也未定义开始/结束锚点。
鉴于您的要求,您可能需要类似的东西:
'(abc 1001( %)?)|((% )?1001 abc)'
( %)?
的含义是可选地将一个空格与任何零个或多个字符匹配。给定整个字符串必须匹配,这意味着它将找到字符串的空格或结尾,并且与(% )?
类似。
如果您还需要在字符串的中间找到它,则可能需要添加其他术语(但您的示例均不建议这样做)。
或者直接等于(^|\s)1001(\s|$)
:
'(%[[:WHITESPACE:]])?1001([[:WHITESPACE:]]%)?'
此答案的早期版本使用(% |)
而不是(% )?
,但是由于没有记录空词,也不是标准的一部分,因此可能是实现错误或充其量是未记录的特征。使用它需要您自担风险。
答案 1 :(得分:2)
现在,(^|\s)1001(\s|$)
不起作用,因为它意味着您希望获得部分匹配。 SIMILAR TO
是不可能的:
SIMILAR TO将字符串与SQL正则表达式模式匹配。与其他语言不同,该模式必须匹配整个字符串才能成功-匹配子字符串是不够的。
然后,(^|\s)
表示字符串开头或空格。这意味着,您应该检查字符串是否包含任何字符,然后在字符串的开头可以出现空格或仅1001
。 ($|\s)
表示字符串结尾或空格。也就是说,您需要解决3种情况:
1001
,空格和任何字符1001
,空格,任意字符1001
您需要使用
WHERE col SIMILAR TO '%[[:WHITESPACE:]]1001[[:WHITESPACE:]]%' or col SIMILAR TO '1001[[:WHITESPACE:]]%' or col SIMILAR TO '%[[:WHITESPACE:]]1001'