6

Mam duży problem, aby napisać wyrażenie regularne, które usunie wszystkie białe znaki w moim wprowadzeniu.Wyrażenia regularne - pasujące białe znaki

Próbowałem \s+ i [ \t\t\r]+, ale to nie działa.

Potrzebuję tego, ponieważ piszę skaner za pomocą flex i utknąłem w pasującym odstępie. Białe spacje powinny być dopasowane, a nie usunięte.

Przykład Wejście:

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

Odpowiedz

7
  1. flex zastosowania (w przybliżeniu) POSIX "rozszerzone wyrażenie regularne" składnia - \s nie działa, ponieważ jest to rozszerzenie Perl.

  2. Czy [ \t\t\r]+ to literówka? Myślę, że będziesz tam potrzebował \n.

Coś [ \n\t\r]+ pewnością powinien pracy. Na przykład ten lexer (który mam zapisany jako 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; 
} 

... skutecznie dopasowuje spacje W przykładzie wejścia (który mam zapisany jako 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: ' 
' 
+0

Tak Miałem na myśli \ n zamiast do t: s w [\ t \ t \ r] + Dziękuję za odpowiedź, poprawność :) – mrjasmin

+0

Użyj '[\ n \ t \ r \ f] +' do dopasowania wszystkich zakończeń linii. Pominięcie '\ f' nie będzie zgodne z zakończeniami plików systemu Windows/DOS. Źródło: http://web.eecs.utk.edu/~bvz/cs461/notes/flex/ – ribamar

-1

Nie jestem specjalistą w flex, ale mają należy użyć/g/m flagi w wyrażeniu regularnym, aby pracować z multilinii srings.