6

我遇到了一個很大的問題,要編寫一個正則表達式來修剪輸入中的所有空白。正則表達式 - 匹配空格

我試過\s+[ \t\t\r]+但是不起作用。

我需要這個,因爲我正在用flex寫一個掃描器,而且我被困在匹配的空白處。 空白只能匹配而不能刪除。

例輸入:

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

回答

7
  1. flex用途(近似)POSIX 「擴展正則表達式」 語法 - \s不起作用,因爲它是一個Perl擴展。

  2. [ \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: ' 
' 
+0

是我的意思是\ n,而不是在[\ t \ t \ r]中輸入t:+感謝您的回答,它的正確性:) – mrjasmin

+0

使用'[\ n \ t \ r \ f] +'匹配所有行結尾。省略'\ f'將不匹配Windows/DOS文件結尾。 來源:http://web.eecs.utk.edu/~bvz/cs461/notes/flex/ – ribamar

-1

我不是在彎曲的專家,但你應該在你的正則表達式中使用/ G和/ M標誌,具有多srings工作。