代码之家  ›  专栏  ›  技术社区  ›  David542

一个空的正则表达式是如何计算的?

  •  0
  • David542  · 技术社区  · 2 年前

    做以下事情:

    select regexp_matches('X', '');
    

    空字符串的正则表达式是否定义了行为?如果是,它通常是如何工作的?

    换句话说,以下哪一项是基础生产(忽略一些高级构造,如重复、分组等)?

    regex
        : atom+
        ;
    

    或者:

    regex
        : atom*
        ;
    

    例如:

    enter image description here

    regex101显示所有7种风格都不匹配,但Postgres返回 true 在…上 select regexp_matches('X', '');

    0 回复  |  直到 2 年前
        1
  •  1
  •   rici    2 年前

    根据定义,空正则表达式与空字符串匹配。在子字符串匹配中(这是PostgreSQL的 regex_match performes),匹配总是成功的,因为空字符串是每个字符串的子字符串,包括它自己。因此,它不是一个非常有用的查询,但它应该与任何regex实现一起使用。(作为全字符串匹配,它可能更有用,但字符串相等也会起作用,而且可能会减少开销。)

    不同regex实现之间的空匹配的一个方面是它们如何与“全局”(重复应用程序)标志或等效标志交互。大多数正则表达式引擎在成功匹配零长度子字符串后会前进一个字符,但也有例外。一般来说,可为null的正则表达式(包括空正则表达式)不应与重复的应用程序标志一起使用,除非正则表达式库明确记录了结果(而且,就其价值而言,我找不到PostgreSQL的此类文档,但这并不意味着它不存在)。