求助,elisp 正则表达式过度匹配疑问

我需要一个捕获所有整数、浮点数和16进制数的表达式,如下:

"\\<[0-9][0-9\\|a-f\\|A-F\\|x\\|X\\|\\.]*?\\>"

可以基本达到需求,但是类似

a_100 
b_0f

其中的数字和包含16进制数的字符也会被匹配。应该怎么改呢?求大拿指点

应该不行,因为 elisp 正则不支持 零宽断言。无法在不捕获前后匹配项的情况下进行判断。只能回溯,作单独的判断。

另外你的这个正则不太准确,无法匹配以 a-f 开头的十六进制数。我写了一个:

"\\<[[:xdigit:]]+\\.?[[:xdigit:]]*\\>"

不知道你的应用场景是什么,因为十六进制中有部分字母,所以可能会和单词混淆,也需要作额外的判断。

我主要是看些汇编的源码,16进制基本都是0x开头的。主要就是想给这些常量数字加个标识色好区分。 对正则一直都是一知半解没深研究过。表达式里面的 :xdigit: 是什么意思呢?

另外,试了下你提供的表达式对0x/0X开头的识别不了。

试试框在符号两边,符号比字范围大,如 a_100 包含一个符号两个字

(with-temp-buffer ;; fresh syntax table
  (string-match-p
   (rx symbol-start (1+ num) symbol-end)
   "a_100"))
;; => nil

:xdigit: 是任意十六进制的字符,相当于 [0-9a-fA-F]

感谢 @Kinney @xuchunyang 两位的提点。 能力有限我分成了3个表达式分别判断16进制数、整数和是否为symbol中夹杂的数。虽然吃相有点难看但是还是满足了我的需求。抱着能用少折腾的想法先将就着用了。

别用 “吃相难看” 这个词,用 “dirty” 更准确。

是不是在你的正则里面应该用 \\_<\\_> 做边界?因为 _ 会被用来做词的边界,但是不会是符号的边界?

我的理解跟你的刚好相反\\_<..._\\>symbol\\<...\\>word

不相反啊,所以应该用 symbol 而不是 word 啊。