【问题标题】:Regex to find hex colors of #aabbcc format to shorten them to #abc正则表达式查找#aabbcc 格式的十六进制颜色以将它们缩短为#abc
【发布时间】:2018-12-13 23:47:07
【问题描述】:

我需要匹配#aabbcc 格式的十六进制颜色才能将它们缩短为#abc。以下是一些示例:

  • #333333 - 匹配
  • #666666 - 匹配
  • #ff6666 - 匹配
  • #ffaacc - 匹配
  • #d7d7d7 - 不匹配
  • #e5e5e5 - 不匹配

我之前使用过/#([0-9A-Fa-f])(?:\1){5}/g,它与前两个匹配,但我也需要第三个匹配。我卡住了,请帮忙:)

【问题讨论】:

标签: regex hex


【解决方案1】:

看来你想要

/#([0-9a-f])\1([0-9a-f])\2([0-9a-f])\3/gi

并替换为#$1$2$3。请参阅regex demo

详情

  • # - 一个 # 字符
  • ([0-9a-f]) - 第 1 组:十六进制字符
  • \1 - 对第 1 组值的反向引用
  • ([0-9a-f])\2 - 第 2 组匹配十六进制字符和对第 2 组值的反向引用
  • ([0-9a-f])\3 - 第 3 组匹配一个十六进制字符和对第 3 组值的反向引用

演示:

var strs = ['#333333','#666666','#ff6666','#d7d7d7','#e5e5e5'];
var rx = /#([0-9a-f])\1([0-9a-f])\2([0-9a-f])\3/gi;
for (var s of strs) {
  console.log(s, "=>", s.replace(rx, '#$1$2$3'));
}

【讨论】:

  • 只是为了确保:后向引用在表达式中考虑到每个二重奏的第二个数字,但不包括在最终替换中?
  • @TiagoVitorino 内联反向引用(模式内的那些)是消费模式,因此它们匹配的文本会被替换。
  • @TiagoVitorino \1\2\3内联反向引用,它们匹配捕获的文本 由相应的捕获组。 #([0-9a-f])\1 用于对抗#aa 时匹配#,然后a(保存在第1 组中),然后\1 匹配a。如果第二个字母是b,则不匹配。
【解决方案2】:

您之前的解决方案匹配 一个 十六进制数字,然后 同一个数字,5次。

现在您还应该匹配一个十六进制数字,然后是相同的 一个 十六进制数字(第 1 组)。 所有这些都应该重复 3 次,但随着次数的变化 引用捕获组。

所以你可以使用/#([\dA-F])\1([\dA-F])\2([\dA-F])\3\b/gi

对您的解决方案的其他更改:

  • \d 而不是 0-9
  • [A-Z] 带有 i 选项,因此不需要 a-z
  • 单词边界在末尾,“阻止”例如更长的十六进制数字序列。
  • 不需要非捕获组。

【讨论】:

    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 2012-10-02
    • 2012-07-12
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    相关资源
    最近更新 更多