【问题标题】:Regex for matching a string that can not have some characters or a substring用于匹配不能包含某些字符或子字符串的字符串的正则表达式
【发布时间】:2021-07-22 05:31:46
【问题描述】:

我正在尝试根据 Mongo DB specification (mongo 3.6) 为 Mongo DB 集合名称添加路由时间(在 REST API 建模期间)正则表达式验证。

它说(从上面的文档复制粘贴):

Restriction on Collection Names
Collection names should begin with 

 - an underscore or a letter character

and cannot:

 - contain the $.
 - be an empty string (e.g. "").
 - contain the null character.
 - begin with the system. prefix. (Reserved for internal use.)

我的另一个限制(有点)是:它用于根据json-schema supported subset of the regexp 进行的 JSON 模式验证。它不是完整的正则表达式(例如,我不能使用 \d、\w(或者我不能使用 \b<...>\b)。

有了这个,到目前为止,我可以完成其他部分

- begin with the system. prefix. (Reserved for internal use.) 

部分。

这是我目前在我的 REST API JSON 模式中的正则表达式(请参阅下面的模式):

'collectionName': {
                description: "foo bar",
                type: 'string',
                minLength: 1,
                maxLength: 120,
                pattern: '(^[a-zA-Z0-9_][^$ \\0]*$)',  <== this one.
                example: 'MyCollection',
            },

举几个例子进一步说明:

  1. 不应该匹配类似-collection的东西,但应该匹配 _collection或collection
  2. 字符串包含空格或 $ - 不应匹配(例如,collection、collec$$tion)
  3. 类似这样的东西应该匹配:systemCollection
  4. 不应匹配:system.collection // 作为系统。前缀是为 Mongo 保留的。

尽我所能以最好的方式澄清问题。

在这方面的任何帮助将不胜感激。

普拉迪普

【问题讨论】:

  • 你能澄清一下什么没有按预期工作吗?我看不到您希望验证失败但实际未通过的输入示例。
  • 整个 '- 从系统开始。字首。'正则表达式中没有规则。意思是:我之前提到的第 4 点,不应该匹配。请参考本节:“用几个例子进一步澄清”。

标签: regex jsonschema


【解决方案1】:

您需要负前瞻。

^(?!system\.)[a-zA-Z0-9_][^$ \\0]*$

(?!...) 从表达式中的当前位置开始,确保 给定的模式将不匹配。不消耗字符。 - regex101.com

这在 PCRE 中与 ECMAScript 相同。 MongoDB 对其正则表达式使用 PCRE,因此我假设 MongoDB 的 JSON Schema 中的正则表达式也是如此。

这是一个使用示例数据测试用例的示例https://regex101.com/r/CHu6lz/1

我只介绍了您所说的不以system. 开头的情况。您需要扩展正则表达式以添加额外的案例,但现在您应该清楚如何做到这一点,因为您知道负前瞻。

您还需要转义正则表达式以在 JSON 中使用,根据此答案中的 cmets 以及您已经完成的操作。

【讨论】:

  • 你完全正确。我没有涵盖所有用例。如果 OP 像我问的那样给出“应该通过”和“应该失败”的列表,那会更容易。我将更新我的答案以表明它不是完整的解决方案。
  • 很高兴我能帮上忙。 regex101.com 是我使用的正则表达式工具之一!
  • 确实 .. 这个 regex101 很酷。它甚至还显示匹配组 ()。谢谢你的指针@Relequestual。非常感谢。
猜你喜欢
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
相关资源
最近更新 更多