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

示例:

  • abc 1001 abc-真正的
  • abc 121001 abc-假
  • 1001 abc-真正的
  • 121001-假
  • abc 1001-真正的

  • 我尝试将其转换为Firebird中的正则表达式:

    其中COLUMN与(^|[:WHITESPACE:])abc 1001 abc($|[:WHITESPACE:])类似,但^(行的开始)和$(行的结束)不起作用,查询以以下结尾:



    我在https://firebirdsql.org/refdocs/langrefupd25-similar-to.html的Firebird Doc中找不到有关行首和行尾的任何信息

    最佳答案

    从《 Firebird 2.5语言引用》中, SIMILAR TO documentation:

    换句话说,正则表达式是多行的,并且-在给定链接文档的情况下-不提供开始/结束 anchor ,因为已经暗示了这些 anchor (但是整个字符串而不是每行),因为不支持部分匹配。
    Firebird中的正则表达式实现符合SQL标准,该标准也未定义开始/结束 anchor 。
    根据您的要求,您可能需要类似以下内容:

    '(abc 1001( %)?)|((% )?1001 abc)'
    
    其中( %)?表示可以选择匹配一个空格和零个或多个任何字符。给定整个字符串必须匹配,这意味着它将找到字符串的空格或结尾,并且类似于(% )?
    如果您还需要在字符串的中间找到它,则可能需要添加其他术语(但您的示例均不建议这样做)。
    或者,直接等效于(^|\s)1001(\s|$):
    '(%[[:WHITESPACE:]])?1001([[:WHITESPACE:]]%)?'
    

    此答案的较早版本使用(% |)而不是(% )?,但由于没有记录空术语,也不属于标准,因此可能是实现错误或充其量是未记录的功能。使用它需要您自担风险。

    关于与正则表达式类似的SQL,等效于行的开始^和结束$,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52119825/

    10-12 14:09