使用regex从字符串中提取十六进制代码

时间:2014-01-27 14:02:30

标签: javascript regex string parsing extract

我正在尝试使用Node-Red(nodered.org)将消息传递给函数。

所以消息类似于:Can I have 00ff00 please?

我只对十六进制代码值感兴趣,我需要解析消息并使用正则表达式提取十六进制。这是我的代码:

var str = msg.payload;
var colorCode = str.match([A-Fa-f0-9]{6}/g);
return colorCode;

有些事情不对,我收到错误Unexpected token {

即使我放[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]/g我收到A is not defined错误也不行,可能是因为它不认为它是正则表达式。

3 个答案:

答案 0 :(得分:1)

HEX颜色始终从#开始,可以有36位数值。试试/^#[a-z0-9]{3}([a-z0-9]{3})?$/i

'#fff000'.match(/^#[a-z0-9]{3}([a-z0-9]{3})?$/i);//["#fff000", "000"]
'#fff'.match(/^#[a-z0-9]{3}([a-z0-9]{3})?$/i);//["#fff", undefined]

你也有错误打印(你忘了regexp开始斜线),修复了正则表达式:

/[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]/g

仅限6位数值的较短版本:

'#fff000'.match(/^#[a-z0-9]{6}$/i);//["#fff000"]

或多色字符串检查:

'#fff000 #aaabbb #ccc999'.match(/#[a-z0-9]{6}/gi);

答案 1 :(得分:1)

您需要放置/

使用任何

str.match(/[A-Fa-f0-9]{6}/)

str.match(/[a-f0-9]{6}/i)

而不是str.match([A-Fa-f0-9]{6})

现在,如果您的字符串可能包含多个HEX代码,请改用以下代码:

str.match(/[a-f0-9]{6}/gi) - >这将获取所有此类HEX代码的数组,因此您可以使用索引访问每个此类实例,如下所示:

str="Can I have 00fA00 and B0fA0c please?"
hex_codes=str.match(/[a-f0-9]{6}/gi);
//hex_codes[0]=="00fA00" and hex_codes[1]=="B0fA0c"

以下是 fiddle demo

答案 2 :(得分:-1)

正如评论所指出的那样,你错过了正则表达式前面的/来满足Javascript的正则表达式语法。

另外,我建议你在你的正则表达式上加上边界,只是为了避免一些奇怪的场景(比如捕捉“BABABABABA”)。此外,正如下面的评论所指出的,#FFF是颜色的有效值,因此您的正则表达式可以进一步改进。结果如下:

/\b([a-f0-9]{3}|[a-f0-9]{6})\b/i

<强>捕捞量:

Can I have C0ffee please?
The color is #FFF

没有抓住:

Testing 00000ff0000 just to be safe!
Making sure BABABABABA doesn't get catched also :)
Checking #ffff

作为最后一点,您可能需要考虑使用模式 #RRGGBB 来捕捉那些HEX颜色,因为您可能会发现有效的英文单词,其中包含6个字符,并带有来自A-F的字母。因此,如果您想这样做,只需在正则表达式前添加\#

/\#\b([a-f0-9]{3}|[a-f0-9]{6})\b/i

Check this Regex101,它包含一些输入的示例。