【问题标题】:What's the common denominator for regex "pattern" in OpenAPI?OpenAPI 中正则表达式“模式”的共同点是什么?
【发布时间】:2021-10-21 05:46:54
【问题描述】:

我正在使用 FastAPI,它允许pattern=re.compile("(?P<foo>[42a-z]+)...")

https://editor.swagger.io/ 显示此模式的错误。

我的猜测是 Python 的命名组语法 (?P<name>...) 与 ES2018 的 (?<name>...) 不同。

但是,仔细想想,OpenAPI 的理念是互操作性,以及其他一些语言,尤其是。编译语言可能使用另一种表示法,或者可能根本不支持正则表达式中的命名组。

我应该使用什么正则表达式语法的公分母?

【问题讨论】:

    标签: openapi fastapi


    【解决方案1】:

    OpenAPI 使用 json 架构,而 json 架构规范 defines regex 为“一个正则表达式,根据 ECMA-262 正则表达式方言应该是有效的。” Here is the relevant ECMA-262 section.

    当然,非 javascript 实现可能不会太在意,只需使用其平台的默认正则表达式库即可。祝你好运找出共同点:)

    我建议尽可能使用简单的正则表达式。并使用您在生产中使用的库为其添加一些测试。

    【讨论】:

      【解决方案2】:

      Json Schema 推荐一个特定的正则表达式子集,因为作者承认大多数实现不支持完整的 ECMA 262 语法:

      https://json-schema.org/understanding-json-schema/reference/regular_expressions.html

      • 单个 unicode 字符(以下特殊字符除外)匹配自身。
      • .:匹配除换行符以外的任何字符。 (请注意,换行符的构成在一定程度上取决于您的平台和语言环境,但实际上这并不重要)。
      • ^:只匹配字符串的开头。
      • $:只匹配字符串的末尾。
      • (...):将一系列正则表达式组合成一个正则表达式。
      • |:匹配| 符号之前或之后的正则表达式。
      • [abc]:匹配方括号内的任何字符。
      • [a-z]:匹配字符范围。
      • [^abc]:匹配任何未列出的字符。
      • [^a-z]:匹配范围外的任何字符。
      • +:匹配前面正则表达式的一个或多个重复。
      • *:匹配前面正则表达式的零次或多次重复。
      • ?:匹配前面正则表达式的零次或一次重复。
      • +?*???*+? 限定符都是贪婪的;它们匹配尽可能多的文本。有时这种行为是不需要的,您希望匹配尽可能少的字符。
      • (?!x)(?=x):负前瞻和正前瞻。
      • {x}:完全匹配 x 前面正则表达式的出现次数。
      • {x,y}:至少匹配 x 和最多 y 前面的正则表达式。
      • {x,}:匹配 x 出现或更多的前面的正则表达式。
      • {x}?{x,y}?{x,}?:上述表达式的惰性版本。

      附:感谢 @erosb 提出如何找到此建议的想法。

      【讨论】:

        猜你喜欢
        • 2013-08-21
        • 2011-06-15
        • 2015-07-21
        • 2021-07-16
        • 2015-06-09
        相关资源
        最近更新 更多