我正在为Vim编写一个语法文件,我正在寻找一个匹配的正则表达式(所以我可以突出显示)浮点和整数,但不是出现在单词中的数字,如变量或函数名。
此外,该语言不喜欢以5.
或3.e9
等小数点结尾的浮点数。不匹配这些数字是可以接受的。单独匹配这些数字以标记为错误也是可以接受的。
例如,如果我有:
var1 = 3.2e-9
var2 = atan2(5.3, 7e+02)
var3 = -6
然后才能找到 3.2e-9
,5.3
,7e+02
和-6
。可以分多步完成。
例如:
[-+]\=\d
获取整数,但它也会匹配1
中的var1
。
这两个表达式:
[-+]\=\d\+\(\.\d\+\)\=\([eE][-+]\=\d\+\)\=
[-+]\=\.\d\+\([eE][-+]\=\d\+\)\=
匹配带有或不带有科学记数法和整数的浮点数。使用这两个,我们错过了5.
和3.e9
。 (第二个是匹配以小数点开头的数字,如.42
。
我可以告诉正则表达式有关前面的字符吗?
我想到了这一点:
\A[+-]\=\d\+
它会忽略1
中的var1
。但它也会匹配(5
,导致括号突出显示。
我对语法文件的理解让我写道:
syn match myNumber '[-+]\=\d\+\(\.\d\+\)\=\([eE][-+]\=\d\+\)\='
syn match myNumber '[-+]\=\.\d\+\([eE][-+]\=\d\+\)\='
let b:current_syntax = "myLang"
hi def link myNumber Number
在没有regex
的情况下是否有语法高亮?
正如评论中指出的那样,2+3
等表达式可能存在问题。我怎么能说这不是一个字?
那么最佳的数字匹配方法是什么?
答案 0 :(得分:1)
您可能需要以下方法之一:
使用单词开头\<
(:help / \&lt;)
使用负零宽度后视:\@<!
(:help / \ @
使用\zs
(:help / \ zs)强制特定集字符出现在数字之前,但不包括在匹配中。例如,您只能使用空格,换行符或括号,\(\_s\|[()]\)\zs[+-]\=\d\+