Если вы хотите захватить R, G, B в разных подгруппах, чтобы вы могли извлечь их, используя (match-string group)
, вам нужно иметь три различные группы скобок в регулярном выражении в некоторый момент.
\(...\)\(...\)\(...\)
В противном случае, если вы используете шаблон повторения, такой как
\(...\)\{3\}
, у вас есть только одна группа, и после совпадения она будет содержать только значение последнего совпадения.Так, скажем, если у вас есть что-то вроде
\([[:xdigit:]]\{2\}\)\{3\}
, это будет соответствовать строке типа «A0B1C2», но (match-string 1)
будет содержать только содержимое последнего соответствия, то есть «C2»,потому что регулярное выражение определяет только одну группу.
Таким образом, у вас в основном есть два варианта: использовать компактное регулярное выражение, такое как ваше третье, но выполнить дополнительную обработку подстроки, чтобы извлечь шестнадцатеричное число, как предлагает Шон, или использоватьболее сложное регулярное выражение, такое как ваше первое, которое позволяет вам более удобно получать доступ к трем подсовпадениям.
Если вас больше всего беспокоит читаемость кода, вы всегда можете сделать что-то вроде
(let ((hex2 "\\([[:xdigit:]]\\{2\\}\\)"))
(concat "#" hex2 hex2 hex2))
чтобы построить такое более сложное регулярное выражение несколько менее избыточным способом, согласно предложению тройника.