2016-12-13 102 views
0

例如,我们把下面的字符串: #FF00FFNick#AA00efName提取十六进制代码数据

我想创建一个模式来得到下面的输出数组

{ [0] = {"#FF00FF", "Nick"}, [1] = {"#AA00ef", "Name"} }

我写了下面的代码

var reg = /#([a-f\d]{3}){1,2}(.*?)/gi; 

alert(str.match(reg)); 

但输出我只得到十六进制代码子字符串。错误在哪里?

+1

也许['/(#[AF \ d] {6})([^#] +)/ gi'](HTTPS:/ /regex101.com/r/W7kZia/1)会做什么?这个格式是否固定,名称不能包含'#'?或者也许,'(#(?:[a-f \ d] {3}){1,2})([^#] +) –

+0

您对预期结果的格式有点混乱。通常数组由[]表示,而对象字面值表示为{} – AndFisher

+0

我认为示例输出在问题中“示意性”显示,仅显示字符串的哪些部分应该被提取以及应如何分组。维克多,请让我们知道您是否需要更具体的输出类型。 –

回答

1

我建议

/(#(?:[a-f\d]{3}){1,2})([^#]+)/gi 

regex demo

详细

  • (#(?:[a-f\d]{3}){1,2}) - 第1组捕获
    • # - 哈希符号BOL
    • (?:[a-f\d]{3}){1,2} - 十六进制字符的1或2个序列(不区分大小写由于i改性剂)
  • ([^#]+) - 比#其他组2捕获1+字符。

演示:

var s = "#FF00FFNick#AA00efName"; 
 
var re = /(#(?:[a-f\d]{3}){1,2})([^#]+)/gi; 
 
var res = [], m; 
 
while ((m=re.exec(s)) !== null) { 
 
    res.push([m[1], m[2]]); 
 
} 
 
console.log(res);