我正在编写一个应用程序,允许用户输入将作为密钥存储在Firebase中的值。
Firebase密钥要求:
max size - 768 bytes
cannot contain . $ # [ ] / or ASCII control characters 0-31 or 127
allows single spaces, but not double or more spaces
我怎样才能将其表达为正则表达式?
答案 0 :(得分: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.
NB。没有RegEx,这会容易得多:
# 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
答案 1 :(得分:1)
您还没有提供用例,如果这是一个具有一些复杂输入的服务器端应用程序,您可能需要更多,但一般来说,一个人不关心输入中的控制字符,因为这将是某人修补关于并试图破解事物,并且会被SDK拒绝。
Firebase小组generally just focuses on the invalid, keyboard-producible characters:
// in JavaScript
function isValidKey(text) {
return typeof text === 'string' &&
text.length &&
!text.match(/[.$\[\]#\/]/);
}
有几个例外:.value
,.priority
和.info
是Firebase中的有效密钥,但仅用于访问特殊元数据而非记录ID。
旁注:我没有在文档中看到有关双空格的任何内容。