6

Ich habe ein großes Problem, eine Regexp zu schreiben, die alle Leerzeichen in meiner Eingabe trimmen wird.Reguläre Ausdrücke - Passende Leerzeichen

Ich habe versucht \s+ und aber das funktioniert nicht.

Ich brauche das, weil ich einen Scanner mit flex schreibe, und ich bin bei der Anpassung whitespace fest. Der Leerraum sollte nur angepasst und nicht entfernt werden.

Beispiel Eingabe:

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

Antwort

7
  1. flex Anwendungen (etwa) die POSIX "Regular Expression Erweitert" - \s nicht funktioniert, weil es eine Perl-Erweiterung ist.

  2. Ist [ \t\t\r]+ ein Tippfehler? Ich denke du wirst eine \n drin haben wollen.

So etwas wie [ \n\t\r]+ sicherlich sollte Arbeit. Zum Beispiel diese Lexer (die ich als lexer.l gespeichert haben):

%{ 

#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; 
} 

... Spiele erfolgreich die Leerzeichen in Ihrem Beispiel Eingang (die ich als input.txt gespeichert haben):

$ 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

Ja Ich meinte \ n statt t: s in [\ t \ t \ r] + Danke für deine Antwort, es ist korrekt :) – mrjasmin

+0

Verwende '[\ n \ t \ r \ f] +' um alle Zeilenenden zu finden. Das Auslassen von '\ f' passt nicht zu den Endungen von Windows/DOS-Dateien. Quelle: http://web.eecs.utk.edu/~bvz/cs461/notes/flex/ – ribamar

-1

Ich bin kein Spezialist in flex, aber haben Sie verwenden sollen/g und/m Flaggen in Ihrem regulären Ausdruck, mit mehrzeiligen Srings zu arbeiten. Syntax