【问题标题】:Validating a GUID in JavaScript [duplicate]在 JavaScript 中验证 GUID [重复]
【发布时间】:2014-07-04 11:20:21
【问题描述】:

我正在尝试构建一个正则表达式来检查一个值是否是RFC4122 有效的 GUID。为了做到这一点,我正在使用以下内容:

var id = '1e601ec7-fb00-4deb-a8bb-d9da5147d878';
var pattern = new RegExp('/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i');
if (pattern.test(id) === true) {
  console.log('We have a winner!');
} else {
  console.log('This is not a valid GUID.');
}

我确信我的 GUID 是有效的 GUID。我以为我抓住了 GUID 的正确正则表达式。但是,无论如何,我总是会收到一个错误,指出它不是 GUID。

我做错了什么?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    当您使用new RegExp 构造正则表达式时,您不能在正则表达式中包含/ 字符,并且您应该将i 等修饰符作为第二个参数传递给构造函数:

    var pattern = new RegExp('^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', 'i');
    

    但在这种情况下,没有必要使用new RegExp - 你可以说:

    var pattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
    

    【讨论】:

    • 这不完全有效,试试这个:d1f9c98a-48b8-454e-68a2-08d76f610dac
    • 这不是有效的 guid,因此答案是正确的
    • 杰洛特,为什么不呢?长度正确,请解释。
    • 您的示例无效,因为“variant”字段的值无效。 “变体”由数字 17(第四个簇的第一个字符)的前两位或三位表示。版本 4 UUID 必须具有“10”(变体 1)或“110”(变体 2)作为十六进制数字指示的半字节(半字节)的最高有效位。这实质上意味着这个十六进制数字的值是 8 (1000)、9 (1001)、a (1010)、b (1011) 用于变体 1,c (1100) 或 d (1101) 用于 var2 UUID。您的示例 UUID 在这个位置有“6”,这不是这个数字的有效值。
    • 另外值得注意的是,上面的 RE 只验证 var1 UUID;只有 var 1 是常用的,因为 var2 是具有不一致字节顺序的遗留怪异,是为 Microsoft COM 保留的,因此不常用也不应该常用。变体 2 UUID 也只有一半的“随机性”,因为变体编号丢失了一个额外的位(3 位而不是 2 位)。所以请忽略它们 - 使用上面的正则表达式 :)
    【解决方案2】:

    如果您使用RegExp 对象,则不能将修饰符添加为/i。您必须将它们作为第二个参数传递给构造函数:

    new RegExp('^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', 'i');
    

    或者使用文字语法:

    /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-12
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-24
      • 2020-10-19
      • 2015-09-02
      相关资源
      最近更新 更多