regex - Emacs Lisp : matching a repeated pattern in a compact manner?

标签 regex emacs elisp

假设我有一个RGB字符串(格式:#<2十六进制数字> <2十六进制数字> <2十六进制数字>),如下所示:

"#00BBCC"

并且我想以比使用显而易见的方式更紧凑的方式来匹配和捕获其<2 hex digits>元素:
"#\\([[:xdigit:]\\{2\\}]\\)\\([[:xdigit:]\\{2\\}]\\)\\([[:xdigit:]\\{2\\}]\\)"

我试过了:
"#\\([[:xdigit:]]\\{2\\}\\)\\{3\\}"

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

但是,它们匹配的最多的是第一个<2 hex digits>元素。

任何想法?谢谢你。

最佳答案

如果要在不同的子组中捕获R,G,B,以便可以使用(match-string group)提取它们,则需要在正则表达式中的某个位置包含三个不同的括号组。

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

否则,如果您使用重复模式,例如
\(...\)\{3\}

您只有一个组,并且在匹配之后,它将仅包含最后一个匹配的值。所以,说,如果你有一些类似的东西
\([[:xdigit:]]\{2\}\)\{3\}

它会与“A0B1C2”之类的字符串匹配,但(match-string 1)仅包含最后一个匹配项的内容,即“C2”,因为正则表达式仅定义了一个组。

因此,您基本上有两个选择:使用紧凑的正则表达式(例如第三个),但按照Sean的建议进行更多的子字符串处理以提取十六进制数,或者使用更复杂的正则表达式(例如第一个)来访问这三个子比赛更方便。

如果您主要担心代码的可读性,则可以始终执行类似的操作
(let ((hex2 "\\([[:xdigit:]]\\{2\\}\\)"))
  (concat "#" hex2 hex2 hex2))

按照三元组的建议,以一种不太冗余的方式构建这样一个更复杂的正则表达式。

关于regex - Emacs Lisp : matching a repeated pattern in a compact manner?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9105092/

相关文章:

Jquery 和 Regex 数字检查

javascript - 允许在 javascript 中使用带有西类牙语正则表达式的字母数字吗?

macos - 尝试使用 tramp 访问远程文件时如何修复 "Wrong Type Argument: listp,"错误?

emacs - EShell中的多行输入

emacs - latex ,Emacs : automatically open *TeX Help* buffer on error and close it after correction of the error?

javascript - 正则表达式分别匹配方括号中的文本

regex - Laravel 模式验证管道字符问题

emacs - 如何显示模块的完整路径

emacs - 使Emacs :/usr/bin/ld: cannot find -lpng15

regex - rx-to-string 和 no-group 参数