加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – Emacs Lisp:以紧凑的方式匹配重复模式?

发布时间:2020-12-14 05:59:37 所属栏目:百科 来源:网络整理
导读:假设我有一个RGB字符串(格式:# 2十六进制数字 2十六进制数字 2十六进制数字),如下所示: "#00BBCC" 我想匹配并捕获它的 2十六进制数字元素比使用明显的方式更紧凑: "#([[:xdigit:]{2}])([[:xdigit:]{2}])([[:xdigit:]{2}])" 我试
假设我有一个RGB字符串(格式:#< 2十六进制数字>< 2十六进制数字>< 2十六进制数字>),如下所示:

"#00BBCC"

我想匹配并捕获它的< 2十六进制数字>元素比使用明显的方式更紧凑:

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

我试过了:

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

和:

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

但他们匹配的最多是第一个< 2十六进制数字>元件.

任何的想法?谢谢.

解决方法

如果要在不同的子组中捕获R,G,B,以便可以使用(匹配字符串组)提取它们,则需要在regexp中有三个不同的括号组.

(...)(...)(...)

否则,如果您使用重复模式,如

(...){3}

你只有一个组,在匹配后它只包含最后一个匹配的值.所以,比方说,如果你有一些东西

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

它将匹配像“A0B1C2”这样的字符串,但是(匹配字符串1)将只包含最后一个匹配的内容,即“C2”,因为正则表达式只定义了一个组.

因此,你基本上有两个选择:使用紧凑的正则表达式,例如你的第三个,但是做一些子串处理来提取肖恩建议的十六进制数,或者使用更复杂的正则表达式,例如你的第一个,它允许你访问三个子比赛更方便.

如果你最担心代码可读性,你总是可以做类似的事情

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

根据tripleee的建议,以一种不那么冗余的方式构建这样一个更复杂的正则表达式.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读