我需要一个捕获所有整数、浮点数和16进制数的表达式,如下:
"\\<[0-9][0-9\\|a-f\\|A-F\\|x\\|X\\|\\.]*?\\>"
可以基本达到需求,但是类似
a_100
b_0f
其中的数字和包含16进制数的字符也会被匹配。应该怎么改呢?求大拿指点
我需要一个捕获所有整数、浮点数和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 啊。