正则表达式为六进制十进制组合的字符串

时间:2015-06-17 06:02:03

标签: javascript regex

我需要一个正则表达式来测试十六进制字符串的组合。具体来说,字符串必须具有:

  • 至少一个数字,范围为0 - 9,
  • A - F,
  • 范围内的至少一位数字
  • 长12个字符。
  • 字符串不应以0
  • 开头

目前我正在使用var macRegex = new RegExp("^[0-9A-Fa-f]{12}$");。上面的正则表达式允许我想避免的字符串如“111111111111”,“000000000000”。它应该允许像“944a0c122123”

这样的字符串

我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:3)

为了保持正则表达式的简单,我将单独匹配模式并检查长度:

var re = /^(\d+[a-f]+[\da-f]*|[a-f]+\d+[\da-f]*)$/i;
var s  = '011001aFFA77';
console.log(re.test(s) && s.length == 12); // true

var s  = '000000000000';
console.log(re.test(s) && s.length == 12); // false

要匹配的模式:

  1. 一个或多个数字后跟一个或多个字母a到f后跟零个或多个数字或字母a到f,或
  2. 一个或多个字母a到f后跟一个或多个数字后跟零个或多个数字或字母a到f
  3. 然后检查长度是12。

    修改

    为了满足新标准“不能以0 开头”(并简化表达式),正则表达式可以是:

    var re = /^([1-9]\d*[a-f]+|[a-f]+\d+)[\da-f]*$/i;
    
    var s  = '011001aFFA77';
    console.log(re.test(s) && s.length == 12); // false
    
    var s  = '000000000000';
    console.log(re.test(s) && s.length == 12); // false
    
    
    var s  = '011001aFFA77';
    console.log(re.test(s) && s.length == 12); // false
    
    var s  = 'a11001aFFA77';
    console.log(re.test(s) && s.length == 12); // true
    
    var s  = '311001aFFA77';
    console.log(re.test(s) && s.length == 12); // true
    
    var s = '0000000000a1';
    console.log(re.test(s) && s.length == 12); // false
    

答案 1 :(得分:2)

如果你不介意非RegExp解决方案,这个功能应该做你想要的。

function only_hex_len_12(str){

    // if the string is the wrong length return false
    if(str.length!=12) return false;

    var hex_val=parseInt(str,16);
    var dec_val=parseInt(str,10);


    // If the string is dec return false
    if(!isNaN(dec_val)) return false;


    // If the string is not hex return false
    if(isNaN(hex_val)) return false;

    // Otherwise the string is okay so return true
    return true;
}

如果您想要一个RegExp解决方案,RobG的答案看起来不错。

答案 2 :(得分:2)

以下是我的方式:

/^(?=.*\d)(?=.*[a-f])[1-9a-f][\da-f]{10}[1-9a-f]$/i

<强>解释

/
  ^             : begining of string
  (?=.*\d)      : lookahead, at least one digit
  (?=.*[a-f])   : lookahead, at least one letter in range a-f
  [1-9a-f]      : first character, not zero
  [\da-f]{10}   : ten hex character
  [1-9a-f]      : last character, not zero
  $             : end of string
/i              : case insensitive

答案 3 :(得分:1)

您可以使用一组正向前瞻来执行此操作。

这是正则表达式:

/(?!0).(?=.*\d)(?=.*[a-f])[\da-f]{11}/i

(?!0)                                 Negative lookahead
.                                     Match any character
(?=                                   Positive lookahead
    .*                                Match any character zero to unlimited
    \d                                Match a digit
)
(?=                                   Positive lookahead
    .*                                Match any character zero to unlimited
    [a-f]                             Match a character a-f
)
[\da-f]{11}                           Match any of the valid characters, 12 times

您可以概念化这是每个前瞻中表达式的逻辑AND(.*除外)。

var regexp = /(?!0).(?=.*\d)(?=.*[a-f])[\da-f]{11}/i;
var test1 = "000000000000";
var test2 = "111111111111";
var test3 = "8179acf0871a";
var test4 = "9abzzzzzzzzz";
var test5 = "0179acf0871a";

console.log(regexp.test(test1));
console.log(regexp.test(test2));
console.log(regexp.test(test3));
console.log(regexp.test(test4));
console.log(regexp.test(test5));

这是一个演示类似输入样本的片段。