2013-05-18 32 views
0

我正在使用下面的正则表达式匹配C整数声明没有初始化。整数可能是无符号:为什么此正则表达式不适用于匹配C整数声明?

^(unsigned[[:space:]]+|^$)int[[:space:]]+[a-zA-Z0-9_]+;$ 

第一部分匹配unsigned后跟一个数量的空格,或没有。第二部分匹配int后跟空格,加上一个变量名和一个分号。

不幸的是,这似乎不匹配不具有它unsigned任何整数声明。我究竟做错了什么? ^$(...|...)模式是否符合我的预期(匹配空字符串)?谷歌和我的正则表达式手册没有帮助。

+2

'^ $'匹配整行空行,因为'$'匹配行的末尾。如果你想使'unsigned'可选,把'?'放在那个组之后。 – Barmar

+0

但是,如果我使用'(unsigned)?',它显然也会与'garbage'匹配...... – user54609

+0

如果您将它固定在行首,则不行。 – Barmar

回答

2

试试这个:

^[[:space:]]*(unsigned[[:space:]]+)?int[[:space:]]+[a-zA-Z0-9_]+;[[:space:]]*$ 

做一团可选,把?后。 ^$与匹配中间的空字符串不匹配,它匹配完全空的字符串 - ^匹配字符串的开头,$匹配字符串的末尾。

+0

是否需要'^'和'$'?由于缩进,我认为它会比实际返回的匹配少。 – nhahtdh

+0

我在声明之前和之后添加了可选空白。 – Barmar

+1

在普通的C编译器中,您正在处理令牌流而不是线。你可以在一行上有多个声明;你可以有一个单独的声明遍布许多行。 –

相关问题