SQL类似于正则表达式,等价于start ^和end $行

B_A*_*T_Y 5 regex sql firebird

我想(^|\s)1001(\s|$)在类似表达式的Firebird中使用正则表达式:

示例:

  • abc 1001 abc - 是的
  • abc 121001 abc - 假
  • 1001 abc - 是的
  • 121001 - 假
  • abc 1001 - 是的

我试着将它转换为Firebird中的正则表达式:

COLUMN类似于(^|[:WHITESPACE:])abc 1001 abc($|[:WHITESPACE:]),但^(行首)和$(行尾)不起作用,查询以:

模式异常的SIMILAR TO无效.

我在Firebird Doc的https://firebirdsql.org/refdocs/langrefupd25-similar-to.html上找不到任何有关开始和结束的信息.

Mar*_*eel 4

来自 Firebird 2.5 语言参考,SIMILAR TO文档

\n
\n

SIMILAR TO 将字符串与 SQL 正则表达式模式匹配。\n与某些其他语言不同,该模式必须匹配整个\n字符串才能成功\xe2\x80\x94仅匹配子字符串是不够的。

\n
\n

换句话说,正则表达式是多行的,并且 - 给定链接的文档 - 不提供开始/结束锚点,因为这些已经隐含了(但然后是整个字符串,而不是每行),因为不支持部分匹配。

\n

Firebird 中的正则表达式实现符合 SQL 标准,该标准也没有定义开始/结束锚点。

\n

根据您的要求,您可能需要类似的东西:

\n
\'(abc 1001( %)?)|((% )?1001 abc)\'\n
Run Code Online (Sandbox Code Playgroud)\n

其中( %)?意味着可选地匹配空格和零个或多个任何字符。鉴于整个字符串必须匹配,这意味着它会找到空格或字符串末尾,与 类似(% )?

\n

如果您还需要在字符串中间找到它,您可能需要添加其他术语(但您的示例都没有建议这样做)。

\n

或者,直接等价于(^|\\s)1001(\\s|$)

\n
\'(%[[:WHITESPACE:]])?1001([[:WHITESPACE:]]%)?\'\n
Run Code Online (Sandbox Code Playgroud)\n
\n

该答案的早期版本使用(% |)而不是(% )?,但鉴于空术语未记录也不属于标准的一部分,这可能是一个实现错误或充其量是一个未记录的功能。使用它需要您自担风险。

\n