Regexp:如何找到查找字符范围的序列,但如果找到序列则停止?

时间:2016-07-19 10:24:59

标签: regex replace find match

我的CSS文件已经破了,其中包含完整的字符和损坏的color: #{hexval};属性。

我想检索十六进制值。从技术上讲,我想:

  • 查找模式('颜色#'+ 6个字符)。
  • 从找到的模式中,检查最多3个最后字符是否为'c','o'或'l',在这种情况下发现模式更改('颜色#'+ 3个字符)[因此它不重叠另一个'颜色#'序列]。
  • 删除除了找到的图案以外的任何图案,找到图案的'颜色#'。

我一直在修补Regex101(https://regex101.com/)和谷歌一小时,只能获得这些:

  • /(?:color#+.....)\w/g
  • /(?:color#+.....+?(?=color))\w/g
<是的,[不管你信不信,我自己写下了这些可耻的恐怖事件,并为此感到非常自豪。]

问题是:

  • /(?:color#+.....)\w/g在开始时有效,但在字符串后面会中断。
  • /(?:color#+.....+?(?=color#))\w/g在开始时似乎更好,但在字符串中稍后会有不同的方式。

......我不知道为什么或如何,所以我坚持'找到匹配模式'部分。我首先尝试了一些替代品,但它没有用,我失去了我做的事情。

任何帮助将不胜感激。谢谢。

color.txt档案样本

ccolor#969896c1color#0086b3eecolor#795da31color#333ecolor#63a35ccolor#a71d5dde1cceeacolor#183691color#ed6a43dcolor#b52a1dcolor#f8f8f8color#b52a1drccecolor#63a35clcolor#693a17ecolor#1d3e81color#008080ccolor#333bcolor#333dcolor#bd2c00color#ffecec1color#55a532color#eaffeadrcolor#795da3ocolor#1d3e81er #ffffffcolor#999999r1#e8e8e8blcolor#ffffffcolor#333333crorcolor#000000erlayer#c8c8fal0030#ffffff2erlayere#C6

结果示例:

Regex on Regex101

C 颜色#969896 c1color#0086b3eecolor#795da31color#333ecolor#63a35ccolor#a71d5dde1cceeacolor#183691color#ed6a43dcolor#b52a1dcolor#f8f8f8color#b52a1drccecolor#63a35clcolor#693a17ecolor#1d3e81color#008080ccolor#333bcolor#333dcolor#bd2c00color# ffecec1color#55a532color#eaffeadrcolor#795da3ocolor#1d3e81er#ffffffcolor#999999r1#e8e8e8blcolor#FFF的 fffcolor#333 333crorcolor#000000erlayer#c8c8fal0030#ffffff2erlayere#C6

编辑:正如WiktorStribiżew和Maria Deleva所发现的那样,问题是当一个序列像color#fff那样结束并且后面跟寄生虫文本(例如'ab')那么另一个{{ 1}}'s'c',正则表达式没有“识别”十六进制三元组。 [仍然,除了添加异常(例如'如果十六进制值的3个第一个字符相同而最后一个字符是'c',只考虑3个第一个字符),我看不到如何检测寄生序列。 ]

2 个答案:

答案 0 :(得分:1)

您希望在[a-zA-Z0-9]之后检索十六进制值(6 color#个字符)。

您可以使用

/color#([a-z0-9]{6})/gi

请参阅regex demo,您需要的值在第1组内。

正则表达式匹配:

  • color# - 文字color#字符串
  • ([a-z0-9]{6}) - 第1组捕获6(由于限制量词{6})字符a-zA-Z内部(作为不区分大小写的修饰符{{1}) }已使用)或/i

或者匹配6和3字符十六进制值:

0-9

another regex demo

<强>解释

  • /color#([a-f0-9]{6}|[a-f0-9]{3}(?!c(?:ol?)?))/gi - 文字子词color#
  • color# - 第1组捕获2个替代方案中的任何一个:
    • ([a-f0-9]{6}|[a-f0-9]{3}(?!c(?:ol?)?)) - 6个十六进制字符([a-f0-9]{6}a-z个字母或A-Z个数字)
    • 0-9 - 或
    • | - 未跟[a-f0-9]{3}(?!c(?:ol?)?)cco的3个十六进制字符。

答案 1 :(得分:1)

这是我的版本:

(color#(?:[a-f0-9]{6}(?!olor)|[a-f0-9]{3}))

在线演示 https://regex101.com/r/kR1fF0/4

基本上,如果跟随olor(即,如果它意外地从颜色中吸收了c),我将丢弃该匹配,如果它不匹配所有6,它将尝试匹配3个字符。