【问题标题】:Google RE2 Regex Escaping periods and underscores errorGoogle RE2 Regex 转义句点和下划线错误
【发布时间】:2019-01-30 07:09:36
【问题描述】:

我正在尝试验证具有以下特征的 username 字符串:

  • 不以._ 开头
  • 不以. 结尾
  • 不允许连续出现两个.
  • 仅小写 letter charactersnumbers

我的代码是username.matches('^(?!\.)(?!_)(?!.*\.$)(?!.*?\.\.)[a-z0-9_.]+$')

在线使用正则表达式模拟器可以正常工作

https://regex101.com/r/bDXMg3/2/

但是在 Google RE2 语法(用于 Firestore Security Rules)中使用相同的语法会引发大量错误

然后我尝试对每个 . 进行双重转义

使用代码username.matches('^(?!\\.)(?!_)(?!.*\\.$)(?!.*?\\.\\.)[a-z0-9_.]+$')

它只显示一个错误(开头的红色 ^ 符号),但它给了我下面的错误

Invalid regular expression pattern. Pattern: ^(?!\.)(?!_)(?!.*\.$)(?!.*?\.\.)[a-z0-9_.]+$.

谁能告诉我我做错了什么?

【问题讨论】:

  • 如果真的是 RE2 正在解析这个模式,那么很明显 - 它不支持前瞻/后瞻。实际上,您应该使用/^[a-z0-9]+([_.][a-z0-9]+)*$/
  • 或者,如果我的规则正确,'^[a-z0-9][a-z0-9_]*([.][a-z0-9_]+)*$'
  • 谢谢。似乎工作。如果您添加作为对原始问题的回复,我可以将其标记为已接受的答案
  • 附有解释。

标签: regex re2


【解决方案1】:

RE2 不支持前瞻(也不支持后瞻)。

但是,模式可以在没有环视的情况下重写:

^[a-z0-9][a-z0-9_]*([.][a-z0-9_]+)*$

详情

  • ^ - 字符串开头
  • [a-z0-9] - 字母或数字
  • [a-z0-9_]* - 零个或多个小写字母、数字或下划线
  • ([.][a-z0-9_]+)* - 零个或多个序列
    • [.] - 一个点
    • [a-z0-9_]+ - 一个或多个小写字母、数字或下划线
  • $ - 字符串结束。

【讨论】:

  • 嘿 Wiktor,我调整了您的表达方式以允许使用元音变音符号,并且字符 . 、` ` 、-_ 只允许在字母和数字之间。但是,我很难将整体字符长度限制在 3 到 40 个字符之间。一切正常,除了我不知道把字符限制放在哪里。 ^[a-zA-ZäöüÄÖÜ0-9]+([. _-][a-zA-ZäöüÄÖÜ0-9]+)*$
  • @LukyFoggy 抱歉,使用 RE2 正则表达式,这是不可能的。总字符串长度限制是通过前瞻设置的,但 RE2 不支持这些构造。
  • 我遇到了类似的问题。 @WiktorStribiżew,如果我必须添加一个长度,比如 .{3,30} 我想在^[a-z0-9][a-z0-9_]*([.][a-z0-9_]+)*$ 之前使用(?=.{3,30}$),但那行不通。我该怎么做?
  • @SubhenduKundu 查看我对Github username convention using regex的回答
猜你喜欢
  • 2011-08-28
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多