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]+はtypoですか?あなたはそこに\nが欲しいと思います。

確か[ \n\t\r]+のようなものは動作するはずです。例えば、(私はlexer.lとして保存しました)このレクサー:はい

$ 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

%{ #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として保存した)あなたの例の入力で空白にマッチします – mrjasmin

+0

'[\ n \ t \ r \ f] +'を使ってすべての行末をマッチングさせます。 '\ f'を省略すると、Windows/DOSファイルの終わりと一致しません。 ソース:http://web.eecs.utk.edu/~bvz/cs461/notes/flex/ – ribamar

-1

私はフレックスの専門家でないんだけど、あなたは複数行sringsで動作するように、あなたの正規表現で/グラム/ mでフラグを使用する必要があります持っています。 (約)