正则表达式 - 匹配空格

时间:2012-11-09 23:03:52

标签: regex compiler-construction flex-lexer lex lexical-analysis

编写一个可以修剪输入中所有空格的正则表达式,我遇到了很大的问题。

我已尝试\s+[ \t\t\r]+,但这不起作用。

我需要这个,因为我正在使用flex编写一个扫描仪,我被困在匹配的空格中。 空格应该匹配而不是删除。

示例输入:

program 
3.3 5 7 
{ comment }
string
panic: cant happen

2 个答案:

答案 0 :(得分:11)

  1. flex使用(大约)POSIX“扩展正则表达式”语法 - \s不起作用,因为它是Perl扩展名。

  2. [ \t\t\r]+是拼写错误吗?我想你会想要\n

  3. [ \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。