【问题标题】:Extract hex code from string using regex使用正则表达式从字符串中提取十六进制代码
【发布时间】:2014-01-27 14:02:29
【问题描述】:

我正在尝试使用 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 错误,可能是因为它不认为它是正则表达式。

【问题讨论】:

  • 您的正则表达式前面缺少一个“/” - 它是str.match(/some regex/g);
  • 你也可以用 i 修饰符稍微缩短它

标签: javascript regex string parsing extract


【解决方案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) -> 这将获取所有此类十六进制代码的数组,因此您可以使用数组的索引访问每个此类实例,如下所示:

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

【讨论】:

  • 无论我作为输入传递什么,我仍然无法定义 var str="Can I have 00ff00 please?" var colorCode = str.match(/[A-Fa-f0-9]{6}/);返回颜色代码;输出:未定义即使我把/g参数和return colorCode[0]访问结果也是一样的;
  • 不,还没有我还没有得到任何输出
  • 干杯,它有效.. 我现在唯一的问题是我得到 Object [object Object] 没有方法'match',但这可能是我正在使用的框架(NodeRed).. 谢谢你的帮助
  • 有一个建议给你。始终检查browser-console 以调试此类问题。
【解决方案2】:

十六进制颜色总是从# 开始,并且可以有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);

【讨论】:

  • 为此,假设所有使用的十六进制代码都是 6 位数字。所以我现在有这个代码:'var colorCode = msg.payload.match(/[A-Fa-f0-9]{6}/g);返回颜色代码;'它不会再抛出任何错误,但无论我输入什么,只要正则表达式是正确的,我就会得到“未定义”我也尝试使用 /i 而不是 /g,同样的效果谢谢你的帮助跨度>
  • 我编辑我的答案。我只添加了 6 位值的正则表达式。
【解决方案3】:

正如 cmets 所指出的,您在 Regex 前面错过了一个 / 以满足 Javascript 的 Regex 语法。

另外,我建议您对正则表达式设置界限,以避免出现一些奇怪的情况(例如捕捉“BABABABABA”)。此外,正如下面 cmets 所指出的,#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,它包含一些输入的一些示例。

【讨论】:

  • 很公平,然后是 {3,6}
  • @EvertonAgner ... 这仍然允许#4444
  • 3 或 6 个字符呢?抱歉,不知道它允许 6 个字符以外的其他内容
  • 是的。十六进制颜色是 6 个字符 RRGGBB 但如果每种颜色的值都是相同的两位数,例如 445566,则允许使用 456,FF2288 > F28 等。
猜你喜欢
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
  • 2014-04-24
  • 2016-09-23
  • 2018-11-01
  • 1970-01-01
  • 2011-07-16
相关资源
最近更新 更多