不使用 RegExp 验证 UUID

Pak*_*Pat 2 javascript ecmascript-6

JavaScriptArray.every()没有按我预期的方式工作

我的任务是在不使用 regex 的情况下编写GUID有效性的基本检查。所以我所做的就是检查 guid 字符串中的非破折号字符是否是十六进制数字。

const isValidGUIDChar = (char) =>  !isNaN(+char) || "abcdef".includes(char.toLowerCase());

// let guid = "123";
// let guid = "abc"
let guid = "abc123";

let isGuidValid = guid.replaceAll('-', '').length === 32 && guid.split().every(isValidGUIDChar);

console.log(isGuidValid);  // returns true for either 'abc' or '123' but false for 'abc123'
Run Code Online (Sandbox Code Playgroud)

上面评论中提到的结果是违反直觉的。该every()方法似乎评估为:

“ (每个字符必须是数字),或(每个字符必须来自 'abcdef') ”,

而我需要的,以及看起来直观的,是让它评估:

“ (每个字符)必须(可以是‘abcdef’中的数字) ”

我怎样才能实现后者?

Rok*_*jan 5

  • 您.split()丢失了"" (顺便说一句,请[...guid]与Spread一起使用)
  • 确保您实际使用 32 个字符进行测试!你替换所有破折号
  • 将其用作函数 isGuidValid(guid)- 可重用性,还记得吗?

const isHEX = (ch) => "0123456789abcdef".includes(ch.toLowerCase());

const isGuidValid = (guid) => {
  guid = guid.replaceAll("-", ""); // Format it first!
  return guid.length === 32 && [...guid].every(isHEX);
};

console.log(isGuidValid("adec3dc3-7025-4905-b584-d9e64117f2fd"));  // true
console.log(isGuidValid("adec3dc3-7025-4905-b584-d9e64117f2fz"));  // false
console.log(isGuidValid("adec3dc3-7025-4905-b584-d9e64117f2f"));   // false
Run Code Online (Sandbox Code Playgroud)

考虑到RFC4122将 GIUD/UUID 视为 8-4-4-4-12 个代码点字符组,更稳健的方法是:

const isHEX = h => !isNaN(parseInt(h, 16));
const RFC4122Len = [8, 4, 4, 4, 12];

const isGuidValid = (guid) => {

  // Must have 36 Chars per codepoint (32 + 4 dashes)
  const codePointLenght = [...guid].length;
  if (codePointLenght !== 36) return false;

  // Must have 5 groups
  const groups = guid.split("-");
  if (groups.length !== 5) return false;

  // RFC defines 5 groups of 8-4-4-4-12 codepoints chars each
  const lenMatch = groups.map(gr => [...gr].length).every((len, i) => len === RFC4122Len[i]);
  if (!lenMatch) return false;

  // Finally join groups (without the "-" separators and check for each char is HEX)
  return [...(groups.join(""))].every(isHEX);
};

console.log(isGuidValid("adec3dc3-7025-4905-b584-d9e64117f2fd")); // true
console.log(isGuidValid("adec3dc3-7025-4905-b584-d9e64117f2fz")); // false
console.log(isGuidValid("adec3dc3-7025-4905-b584-d9e64117f2f"));  // false
Run Code Online (Sandbox Code Playgroud)

还有更多使其完全符合 RFC4122 的要求,但您已经了解了总体思路。