什么是正则表达式,可以测试字符串是否是有效的Firebase密钥?

时间:2015-06-03 17:42:45

标签: regex firebase

我正在编写一个应用程序,允许用户输入将作为密钥存储在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

我怎样才能将其表达为正则表达式?

2 个答案:

答案 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。

旁注:我没有在文档中看到有关双空格的任何内容。

character constraints