我正在尝试使用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
错误也不行,可能是因为它不认为它是正则表达式。
答案 0 :(得分:1)
HEX颜色始终从#
开始,可以有3
或6
位数值。试试/^#[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,它包含一些输入的示例。