编写一个可以修剪输入中所有空格的正则表达式,我遇到了很大的问题。
我已尝试\s+
和[ \t\t\r]+
,但这不起作用。
我需要这个,因为我正在使用flex编写一个扫描仪,我被困在匹配的空格中。 空格应该匹配而不是删除。
示例输入:
program
3.3 5 7
{ comment }
string
panic: cant happen
答案 0 :(得分:11)
flex
使用(大约)POSIX“扩展正则表达式”语法 - \s
不起作用,因为它是Perl扩展名。
[ \t\t\r]+
是拼写错误吗?我想你会想要\n
。
[ \n\t\r]+
当然应该工作。例如,这个词法分析器(我保存为lexer.l
):
%{
#include <stdio.h>
%}
%option noyywrap
%%
[ \n\t\r]+ { printf("Whitespace: '%s'\n", yytext); }
[^ \n\t\r]+ { printf("Non-whitespace: '%s'\n", yytext); }
%%
int main(void)
{
yylex();
return 0;
}
...成功匹配示例输入中的空白(我保存为input.txt
):
$ flex lexer.l
$ gcc -o test lex.yy.c
$ ./test < input.txt
Non-whitespace: 'program'
Whitespace: '
'
Non-whitespace: '3.3'
Whitespace: ' '
Non-whitespace: '5'
Whitespace: ' '
Non-whitespace: '7'
Whitespace: '
'
Non-whitespace: '{'
Whitespace: ' '
Non-whitespace: 'comment'
Whitespace: ' '
Non-whitespace: '}'
Whitespace: '
'
Non-whitespace: 'string'
Whitespace: '
'
Non-whitespace: 'panic:'
Whitespace: ' '
Non-whitespace: 'cant'
Whitespace: ' '
Non-whitespace: 'happen'
Whitespace: '
'
答案 1 :(得分:-1)
我不是flex的专家,但你应该在正则表达式中使用/ g和/ m标志,以使用多行srings。