Vim正则表达式查找不属于其他单词的数字

时间:2014-03-09 15:16:28

标签: regex vim

我正在为Vim编写一个语法文件,我正在寻找一个匹配的正则表达式(所以我可以突出显示)浮点和整数,但不是出现在单词中的数字,如变量或函数名。

此外,该语言不喜欢以5.3.e9等小数点结尾的浮点数。不匹配这些数字是可以接受的。单独匹配这些数字以标记为错误也是可以接受的。

例如,如果我有:

var1 = 3.2e-9
var2 = atan2(5.3, 7e+02)
var3 = -6

然后才能找到 3.2e-95.37e+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等表达式可能存在问题。我怎么能说这不是一个字?

那么最佳的数字匹配方法是什么?

1 个答案:

答案 0 :(得分:1)

您可能需要以下方法之一:

使用单词开头\<(:help / \&lt;)

使用负零宽度后视:\@<!(:help / \ @

使用\zs(:help / \ zs)强制特定集字符出现在数字之前,但不包括在匹配中。例如,您只能使用空格,换行符或括号,\(\_s\|[()]\)\zs[+-]\=\d\+