【问题标题】:Validating a Salesforce Id验证 Salesforce ID
【发布时间】:2012-03-16 18:51:29
【问题描述】:

有没有办法验证 Salesforce ID,也许是使用 RegEx?它们通常是 15 个字符或 18 个字符,但它们是否遵循我们可以用来检查它是否是有效 id 的模式。

【问题讨论】:

  • 你至少知道哪些字符被认为是有效的>?
  • @BogdanEmilMariesan 我不明白你的问题。不同对象记录的字符不同,这就是为什么我认为它不是一个简单的正则表达式。

标签: regex salesforce


【解决方案1】:

验证 salesforce id 有两个级别:

  1. 使用正则表达式检查格式[a-zA-Z0-9]{15}|[a-zA-Z0-9]{18}
  2. 对于 18 个字符的 ID,您可以查看 3-character checksum

cmets中提供的代码示例:

【讨论】:

【解决方案2】:

这样的事情应该可以工作:

[a-zA-Z0-9]{15,18}

有人建议这可能更正确,因为它可以防止长度为 16 和 17 个字符的 Id 被拒绝,我们也尝试首先匹配 18 个字符长度,并以 15 个长度作为后备:

[a-zA-Z0-9]{18}|[a-zA-Z0-9]{15}

【讨论】:

  • 更简洁的表达方式是\w{15,18}
  • 在大多数正则表达式实现中,\w 将包含_,因此上述不正确。
  • 这仅适用于 15 个字符长的 ID。 3 个字符的后缀是从前 15 个字符计算出来的。如果您不确定 18 个字符长的 ID 是否有正确的后缀,最好将它们剪掉。它是一样的,但“15”ID 不能以不区分大小写的方式排序。基本上,您可以将任何与[a-zA-Z0-9]{15}[a-zA-Z0-9]{18} 匹配并带有右后缀的东西作为ID 传递。其他一切都会失败。
  • 不幸的是,这似乎不适用于所有情况。看来,salesforce 除了格式(15 位或 18 位,字母数字)之外还进行了额外的验证,并且我遇到了在尝试将与此正则表达式匹配的 id 分配给 id 变量时遇到字符串异常的情况......
  • 您不需要锚定正则表达式模式以防止长度超过 18 的字符串通过吗?像这样:^([a-zA-Z0-9]{15}|[a-zA-Z0-9]{18})$
【解决方案3】:

只需使用 instanceOf 来检查字符串是否是 Id 的实例。

String s = '1234';
if (s instanceOf Id) System.debug('valid id');
else System.debug('invalid id');

【讨论】:

  • 哇,回想起来似乎很明显,但我从未想过尝试instanceof。比 try-catch 块好多了。
  • 这是最好的答案——简单明了
  • 看来这不是万无一失的。 instanceof 为“403E1005-CC70-48B6”返回 true。
【解决方案4】:

我遇到的最简单的方法是创建一个新的 ID 变量并为其分配一个字符串。

ID MyTestID = null;
try {
    MyTestID = MyTestString; }
catch(Exception ex) { }

如果 MyTestID 在尝试分配后为 null,则 ID 无效。

【讨论】:

  • 是的,我在 salesforce 开发人员论坛中看到了这个解决方案,但想知道是否有更好的方法来验证 salesforce id。不过谢谢!
  • 这是好的做法吗?我尽量避免 try-catch (不代表我用的不好)我一直认为 try-catch 资源很重。
  • 这是不好的做法的原因是你不应该轻率地使用 try/catch。原因是 Try/Catch 是一个非常复杂的操作,导致您的代码在处理器上运行更多周期。当然,时间复杂度因语言和编译器而异,但我认为我们都可以放心地假设 Apex 的版本很可能很糟糕。
  • 我同意两位 cmets 质疑这是否是一种好的做法,但我认为如果你只打算在单个用户输入上执行它是完全可以的。它可能会很慢,但因为只有一次运行,所以你不会注意到它。
  • @Ralph 我只是想到了另一个可能更糟糕的想法 - 尝试删除记录并查找其是否有效。所以是的,这将是最有效的方法
【解决方案5】:

到目前为止,这个正则表达式给了我最佳结果。

\b[a-z0-9]\w{4}0\w{12}|[a-z0-9]\w{4}0\w{9}\b

【讨论】:

    【解决方案6】:

    你也可以检查 15 个字符,然后添加一个额外的 3 个可选字符,表达式类似于:

    ^[a-z0-9]{15}(?:[a-z0-9]{3})?$
    

    是否开启i模式:

    ^[A-Za-z0-9]{15}(?:[A-Za-z0-9]{3})?$
    

    Demo


    如果您希望简化/修改/探索表达式,在regex101.com 的右上角面板中已对此进行了说明。如果您愿意,您还可以在this link 中观看它如何与一些示例输入匹配。


    正则表达式电路

    jex.im 可视化正则表达式:

    【讨论】:

      【解决方案7】:

      Javascript:/^(?=.*?\d)(?=.*?[a-z])[a-z\d]{18}$/i

      这些是我的 Salesforce ID 验证要求。

      1. 仅 18 个字符
      2. 至少一位数
      3. 至少一个字母
      4. 不区分大小写

      测试用例

      应该失败

      1
      a
      1234
      abgcde
      1234aDcde
      12345678901234567*
      123456789012345678
      abcDefghijabcdefgh
      

      应该通过

      1234567890abcDeFgh
      1234abcd1234abcd12
      abcd1234abcd1234ab
      1abcDefhijabcdefgf
      abcDefghijabcdefg1
      12345678901234567a
      a12345678901234567
      

      了解正则表达式,请参考this thread

      【讨论】:

        【解决方案8】:

        Daniel Sokolowski 提供的正则表达式可以完美地验证 id 的格式是否正确。

        如果要验证一个id是否对应数据库中的实际记录,首先需要从前三个字符(俗称前缀)中找到对象类型,然后查询对象类型:

        boolean isValidAndExists(String key) {
            Map<String, Schema.SObjectType> objTypes = Schema.getGlobalDescribe();
        
            for (Schema.SObjectType objType : objTypes.values()) {
                Schema.DescribeSObjectResult objDesc = objType.getDescribe();
                if (objDesc.getKeyPrefix() == key.substring(0,3)) {
                    String objName = objDesc.getName();
                    String query = 'SELECT Id FROM ' + objName + ' WHERE Id = \'' + key + '\'';
                    SObject[] objs = Database.query(query);
                    return !objs.isEmpty();
                }
            }
            return false;
        }
        

        请注意,Schema.getGlobalDescribe 可能是一项代价高昂的操作,并且如果您经常使用它会降低应用程序的性能。 如果您需要经常检查,我建议创建自定义设置或自定义元数据来存储前缀和对象类型之间的关系。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多