2012-02-01 14 views
5

ı bir RGB dizesi olduğunu varsayalım (format: # < 2 basamaklı hex> < 2 basamaklı hex> < 2 basamaklı hex>) böyle:Emacs Lisp: tekrarlanan bir modeli kompakt bir şekilde mi eşleştiriyorsunuz?

"#00BBCC" 

ve ben maç ve < yakalamak istiyorum 2 basamaklı hex>, daha kompakt bir şekilde elemanlar daha belirgin kullanılarak: denedim

"#\\([[:xdigit:]\\{2\\}]\\)\\([[:xdigit:]\\{2\\}]\\)\\([[:xdigit:]\\{2\\}]\\)" 

:

"#\\([[:xdigit:]]\\{2\\}\\)\\{3\\}" 

ve:

"#\\(\\([[:xdigit:]]\\{2\\}\\)\\{3\\}\\)" 

Ancak çoğu ilk < 2 basamaklı hex> elemanı olmuştur eşleşti.

Herhangi bir fikrin var mı? Teşekkür ederim.

Eğer fazladan kod pahasına regexp'in kısa yapabilir
+0

Bunu neden yapmak istiyorsunuz? Okunabilirlik için? – Thomas

+0

Sadece merak: Yeniden ifadelerin tekrarlanan kalıplarla eşleşip eşleşmeyeceğini merak ediyorum. – Elena

+1

Sorun şu ki 3 farklı gruba başvurmayacaksın, değil mi? Peki, R, G, B değerlerini ayrı ayrı nasıl çıkarırsınız? – Thomas

cevap

1

, ihtiyacınız Bir noktada regexp'inizde üç farklı parantez grubuna sahip olmak. Eğer

\(...\)\{3\} 

gibi bir tekrar desenine kullanırsanız

\(...\)\(...\)\(...\) 

Aksi takdirde, sadece bir grup var ve maçtan sonra sadece son maçın değerini içerecektir. Yani, diyelim ki, sen, bu "A0B1C2" gibi bir dize maç olacak, ama (match-string 1) sadece son maçında, yani "C2" içeriğini içerecektir

\([[:xdigit:]]\{2\}\)\{3\} 

çizgisinde bir şey varsa regexp tanımlayıp çünkü sadece bir grup.

Böylece temel olarak iki seçeneğiniz vardır: üçüncü dizininiz gibi kompakt bir regexp kullanın, ancak hex önerisi almak için hex sayısını ayıklamak için daha fazla alt işlem işlemi yapın veya ilk önce olduğu gibi daha karmaşık bir regexp kullanın. Bu üç alt eşleşmeye daha kolay erişmenizi sağlar.

kod okunabilirliği konusunda çoğunlukla endişeleniyorsanız, her zaman tripleee önerisine göre, biraz daha az yedekli bir şekilde böyle bir daha karmaşık Regexp'i oluşturmak için

(let ((hex2 "\\([[:xdigit:]]\\{2\\}\\)")) 
    (concat "#" hex2 hex2 hex2)) 

gibi bir şey yapabilirdi.

4

: Eğer bunları (match-string group) kullanarak ayıklamak, böylece farklı alt gruplarda R, G, B yakalamak istiyorsanız

(defun match-hex-digits (str) 
    (when (string-match "#[[:xdigit:]]\\{6\\}" str) 
    (list (substring (match-string 0 str) 1 3) 
      (substring (match-string 0 str) 3 5) 
      (substring (match-string 0 str) 5 7)))) 
+1

Güzel bir alternatif fikir, bunu öneriyorum. Ek kod bir fonksiyona dönüştürülebilir. – Elena

+4

Neden olmasın ((xx "\\ ([[: xdigit:]] \\ {2 \\} \\)") (dize eşleşmesi (concat "#" xx xx xx) str))) ? – tripleee

+0

@tripleee Kodumda kullandığım şey budur. Aslında, şimdi bunu düşündüğümde, Sean'ın önerdiği çözümden daha genel bir işlevle yeniden oluşturulabilirdi, çünkü desenler çeşitli uzunluklardaki dizelerle eşleşebilirdi. – Elena

İlgili konular