【问题标题】:Javascript: GUID: RegEx: string to GUIDJavascript:GUID:RegEx:字符串到 GUID
【发布时间】:2022-01-02 04:38:46
【问题描述】:

我有一个用户可以使用 Ctrl+V 粘贴的文本框。我想限制文本框只接受 GUID。我试图编写一个小函数,将输入字符串格式化为基于 RegEx 的 GUID,但我似乎无法做到。我尝试按照以下帖子进行操作: Javascript string to Guid

function stringToGUID()
{
    var strInput = 'b6b954d9cbac4b18b0d5a0f725695f1ca98d64e456f76';
    var strOutput = strInput.replace(/([0-f]{8})([0-f]{4})([0-f]{4})([0-f]{4})([0-f]{12})/,"$1-$2-$3-$4-$5");
    console.log(strOutput );
    //from my understanding, the input string could be any sequence of 0-9 or a-f of any length and a valid giud patterened string would be the result in the above code. This doesn't seem to be the case;
    //I would like to extract first 32 characters; how do I do that?

}

【问题讨论】:

  • "我好像做不到" - 为什么?你遇到了什么问题?
  • 据我了解,我使用的正则表达式模式不仅会找到一个 guid,而且只会提取前 32 个字母数字。好像不是这样的。
  • 用户能否粘贴已包含连字符的 GUID?
  • 十六进制字符需要[0-9a-fA-F]
  • @SoftwareDveloper 在这种情况下,您需要在进一步处理字符串之前删除连字符。

标签: javascript regex string


【解决方案1】:

您已经将 32 个字符与该模式匹配,因此无需进行单独的操作来获取 32 个字符进行测试。

您可以将所有连字符替换为空字符串,然后使用^从字符串开头匹配模式

然后首先检查是否有匹配项,如果有则用 5 个组和中间的连字符进行替换。如果不匹配,则返回原字符串。

函数stringToGUID() 本身不做任何事情,除了记录一个在函数中硬编码的字符串。要扩展其功能,您可以传递一个参数。

function stringToGUID(s) {
  const regex = /^([0-f]{8})([0-f]{4})([0-f]{4})([0-f]{4})([0-f]{12})/;
  const m = s.replace(/-+/g, '').match(regex);
  return m ? `${m[1]}-${m[2]}-${m[3]}-${m[4]}-${m[5]}` : s;
}

[
  'b6b954d9cbac4b18b0d5a0f725695f1ca98d64e456f76',
  'b6b954d9-cbac-4b18-b0d5-a0f725695f1c',
  '----54d9cbac4b18b0d5a0f725695f1ca98d64e456f76',
  '!@#$%'
].forEach(s => {
  console.log(stringToGUID(s));
});

【讨论】:

    【解决方案2】:

    我建议你去掉破折号,截断成32个字符,然后在插入破折号之前测试剩余的字符是否有效:

    function stringToGUID()
    {
        var input = 'b6b954d9cbac4b18b0d5a0f725695f1ca98d64e456f76';
        let g = input.replace("-", "");
        g = g.substring(0, 32);
        if (/^[0-9A-F]{32}$/i.test(g)) {
            g = g.replace(/(.{8})(.{4})(.{4})(.{4})(.{12})/, "$1-$2-$3-$4-$5");
        }
        console.log(g);
    }
    
    stringToGUID();
    

    (正则表达式末尾的i 使其不区分大小写。)

    【讨论】:

    • @SoftwareDveloper 我简化了替换的正则表达式,因为已知所有字符都是有效的。
    猜你喜欢
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多