一个能够测试字符串是否为有效Firebase键的正则表达式是什么?

4

我将编写一个应用程序,允许用户输入需要存储在Firebase中的键和值。

Firebase键(Key)的要求:

max size - 768 bytes
cannot contain . $ # [ ] / or ASCII control characters 0-31 or 127
allows single spaces, but not double or more spaces

我该如何用正则表达式来表示这个呢?
2个回答

3
假设1字节=1字符,由于提到了ASCII码,假设有效字符为ASCII码的32到126。
"匹配这些允许的字符之一,恰好出现768次":
[ !"%&'()*+\,\-\/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\^_`abcdefghijklmnopqrstuvwxyz{|}]{768}

编辑

之前的方法没有奏效,因为我没有考虑到需要阻止连续的空格。新的建议是使用以下基本模式:

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

# a space, not followed by a space
# or a character not followed by a double-space.
# This pattern, matched n times, locking the start and end of the string.

^( (?! )|[a](?!  )){5}$

然而,当我在代码中使用完整字符集时...
^( (?! )|[ !"%&'()*+\,\-\/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\^_`abcdefghijklmnopqrstuvwxyz{|}](?!  )){1,768}$

# it breaks Regex101, saying it's too large.

注意:如果不使用正则表达式,会更加容易:

# Python example validator

def validate(s):
    valid_chars = 'abc123...'

    if not (0 < len(s) <= 768): return False
    if '  ' in s: return False
    for char in s: if char not in valid_chars: return False

    return True

我非常感谢您的回答。不幸的是,还没有完全解决问题。 因为它应该接受小于768的字符串,且如果字符串超过768,则regex.test(string)应返回false。修复这两个问题很容易,将正则表达式修改为-> ^ [...]{1,768} $。唯一剩下的问题是使其可以接受“ ”(空格),但不能接受“ ”(双倍或更多的空格)。再次感谢您的帮助! - Aaron
在开头添加^((?!\s{2}).),并在结尾添加\s?,可以覆盖双倍间距。 - JStevens
@JStevens,即使在regex101和Python中给出一个带有双空格的字符串,它仍然会返回匹配项...并且它允许以空格结尾的769个字符的字符串。 - TessellatingHeckler
1
我误解了,很抱歉。所使用的正则表达式支持向前查找吗? - JStevens
2
那正是我想说的...你比我先说了...如果你用0-9代替列出0123456789,同样用a-z和A-Z代替列出所有字母,那么regex101就不会出错了... - JStevens
显示剩余3条评论

2
您还没有提供使用案例,如果这是一个具有一些复杂输入的服务器端应用程序,则可能需要更多。但一般来说,人们不会关注输入中的控制字符,因为那只是某些人在摆弄并试图破坏事物,而且将被 SDK 相应地拒绝。因此,Firebase 团队通常只关注无效的、可由键盘产生的字符。
// in JavaScript
function isValidKey(text) {
   return typeof text === 'string' && 
      text.length &&
      !text.match(/[.$\[\]#\/]/);
}

有几个例外:.value.priority.info是 Firebase 中有效的键,但仅用于访问特殊元数据,而不是作为记录 ID。
顺便说一下:我在文档中没有看到关于双空格的任何内容。

character constraints


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接