2012-02-01 21 views
5

のは、私はRGBの文字列を持っているとしましょう(形式:#< 2進数> < 2進数> < 2進数>)このように:Emacs Lisp:繰り返しパターンをコンパクトにマッチさせるには?

"#00BBCC" 

と私が一致し、その<をキャプチャしたいのですが2進数字>よりコンパクトな方法で要素よ​​り明らかを使用して:私が試した

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

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

と:

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

しかし、ほとんど、彼らは一致したが、最初の< 2進数>要素となっています。

ありがとうございました。

+0

なぜあなたはそれをしたいですか?読みやすくするために? – Thomas

+0

ちょうど好奇心:regexpsが繰り返しパターンにマッチするかどうか疑問です。 – Elena

+1

問題は3つの異なるグループを参照することができないということです。だから、あなたはR、G、Bの値をどうやって抽出するのですか? – Thomas

答えて

1

ある時点であなたの正規表現に3つの異なるカッコのグループを持つこと。あなたは

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

ような繰り返しパターンを使用している場合

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

そうしないと、あなただけの1基を有していても、そして試合後にそれが唯一の最後のマッチの値が含まれます。正規表現を定義するので、あなたは

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

の線に沿って何かを持っているのであれば、たとえば、それは「A0B1C2」のような文字列に一致しますが、(match-string 1)は、最後の試合の内容が含まれています、すなわち「C2」グループは1つだけです。

したがって、基本的に2つのオプションがあります:3番目のようなコンパクトな正規表現を使用しますが、Seanが示唆するように16進数を抽出するための部分文字列処理を行います。 3つのサブマッチにさらに便利にアクセスすることができます。

あなたは、コードの可読性について主に心配している場合、あなたは常にtripleeeの提案どおり、やや少ない冗長な方法で、このような、より複雑な正規表現を構築するために

​​

ような何かを行うことができます。

4

あなたは、いくつかの余分なコードを犠牲にして正規表現を短くすることができます:あなたは(match-string group)を使用してそれらを抽出できるように、異なるサブグループではR、G、Bをキャプチャしたい場合は、あなたが必要

(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

良いアイデア、私はこれをupvotingしています。余分なコードを関数にリファクタリングすることができます。 – Elena

+4

なぜ、 '(let(xx" \\([[:xdigit:])\\ {2 \\} \\) ")(string-match(concat"# "xx xx xx)str))) ? – tripleee

+0

@tripleeeそれは私のコードで使用しているものです。実際には、私はそれについて考えているので、パターンはさまざまな長さの文字列に一致する可能性があるため、Seanによって提案されたソリューションよりも一般的な機能でリファクタリングできます。 – Elena

関連する問題