Jeśli chcesz uchwycić R, G, B w różnych podgrup, tak aby można było wyodrębnić je za pomocą (match-string group)
, trzeba mieć trzy różne grupy nawiasów w twoim wyrobie w pewnym momencie.
\(...\)\(...\)\(...\)
W przeciwnym razie, jeśli używasz powtarzacie takie jak
\(...\)\{3\}
masz tylko jedną grupę, a po meczu będzie zawierać tylko wartość ostatniego meczu. Tak więc, powiedzmy, jeśli masz coś na wzór
\([[:xdigit:]]\{2\}\)\{3\}
będzie dopasować ciąg jak „A0B1C2”, ale (match-string 1)
będzie zawierał jedynie treść ostatniego meczu, czyli „C2”, ponieważ także wyznacza regexp tylko jedna grupa.
W ten sposób masz dwie opcje: użyj zwartego wyrażenia regularnego, takiego jak trzeci, ale wykonaj więcej przetwarzania podłańcucha, aby wyodrębnić liczbę szesnastkową, tak jak sugeruje Sean, lub użyj bardziej złożonego wyrażenia regularnego, na przykład pierwszego, co pozwala wygodniej uzyskać dostęp do trzech pod-meczów.
Jeśli jesteś głównie martwi czytelności kodu, można coś takiego
(let ((hex2 "\\([[:xdigit:]]\\{2\\}\\)"))
(concat "#" hex2 hex2 hex2))
do skonstruowania takiego bardziej złożone wyrażenia regularnego w nieco mniej redundantny sposób, zgodnie z sugestią tripleee zawsze zrobić.
Dlaczego chcesz to zrobić? Czytelność? – Thomas
Po prostu ciekawość: Zastanawiam się, czy wyrazy regularne mogą pasować do powtarzających się wzorców. – Elena
Problem polega na tym, że nie będziesz w stanie odnosić się do 3 różnych grup, prawda? Jak więc wyodrębnić wartości R, G, B osobno? – Thomas