2017-09-25 5 views
2

ファイルから "行"の配列を取得するためにjavaのString.split(正規表現)で使用できる正規表現を見つけようとしています。3つの別々のケースを満たすRegex

キャリッジリターンは行末を指定するのではなく、カンマで区切りますが、すべてカンマではありません。カンマがかっこ、一重引用符、またはコメント(/ * comment、more comment * /)の間にある場合は、行末を示すものではありません。

例:

1 test fixed(5,2), 
    2 another_test char(12), 
    2 a_third_test, 
    3 one pic'9{9}V.99', 
    3 two pic'9,999V.99', 
    3 three fixed(7,2), 
    /* test,t*/ 
    /*test 2,*/ 
    /*and more */ 
    2 another_field fixed bin(13), 
    2 a_really_long_super_long_field_name_requiring_two_lines_for_declaration 
    char(1), 
    2 a_field char(8); 

予想される出力は、(明確にするために省略\ tと、余分な空白で)です:私は取得するには、3つの別々の正規表現式を作ってみた

1 test fixed(5,2) 
2 another_test char(12) 
2 a_third_test 
3 one pic'9{9}V.99' 
3 two pic'9,999V.99' 
3 three fixed(7,2) 
/* test,t*//*test 2,*//*and more */ 2 another_field fixed bin(13) 
2 a_really_long_super_long_field_name_requiring_two_lines_for_declaration 
    char(1) 
2 a_field char(8) 

3枚:

  • ,(?![^(]*\)) - 括弧
  • 内のすべてのコンマありません
  • (,(?![^']*')) - 単一引用符内のすべてのカンマない
  • (,(?![^\/\*]*\*\/)) - コメント内のすべてのコンマない

は私がまたは(.*?)|(,)|'.*?'|(,)|\/*.*?*\/|(,)とそれらを結ぶ試みたが、次の結果が得てきました:

1 test fixed 
2 another_test char 
2 a_third_test 
3 one pic 
3 two pic 
3 three fixed 
2 another_field fixed bin 
2 a_really_long_super_long_field_name_requiring_a_line_break_...  char 
2 a_field char 

ですそこにこれらの3つの正規表現(またはより良いものがありますか?)を組み合わせて、すべて3を満たすグループを見つけることができますか?

UPDATE:

私はいくつかの単純なJavaで正確なことを実現することができますが、私は、学術の追求として、正規表現でそうしたいと思います。

String temp = ""; 
for(String line:text.split("\n")){ 
    if(line.trim().charAt(line.trim().length()-1) == ',' || line.trim().charAt(line.trim().length()-1) == ';'){ 
    System.out.println(temp + line); 
    temp = ""; 
    } else { 
    temp += line.trim(); 
    } 
} 
+1

オペレーターがこの点で役立つのでしょうか? – jdv

+0

これは、私が試した最初のことでした\(。*?\)|、、| '。*?' |(、)| \/\ *。*?\ * \/|(、) 私が取得:2 3 1 PIC 3 2 PIC 3 3つの固定another_field固定ビン 2 a_really_long_super_long_field_name_requiring_two_lines ... CHAR a_third_test 2 another_test CHAR 2固定 '1のテストを2 a_field char' – gooeylewie

+0

それは質問の本文にあるべきである種類のものです。 – jdv

答えて

0

これはちょっと考えていると思います。 regular languagesの解析には正規表現が使用されていることに注意してください。あなたがコメントや括弧の中にいるかどうか、カンマが何を意味するかを知る必要があるときは、あなたが見ているのはcontext-sensitive languageです(下の図を参照)。 J.フィンケルシュタイン(自分の仕事)BY-SA 3.0(https://creativecommons.org/licenses/by-sa/3.0)CC

により

By J. Finkelstein (Own work) [CC BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0)], via Wikimedia Commons

言われているので、行の最後にコンマとセミコロンと一致十分に簡単です。 /\s*(.*?)[,;]$/gsmは質問のテスト入力に使用できます。しかし、これは私の意見ではこれを回避するための最良のオプションは、\/\*.*?\*\/で解析を開始する前に、コメントを破棄するだろう考慮に

test fixed(5,2), 
/* a, 
    multi-line, 
    comment, 
*/ 

のようなものを取ることはありません。コメントを残しておく必要がある場合は、おそらくネガティブなルアラントを使うことができますが、これらは非常に非効率的で、トークナイザ/パーサーを書く方が良いでしょう。

+0

私は同意する、あなたはおそらく正しいです。 – gooeylewie

+0

私はいくつかの単純なjavaで個々のコンマで区切られた行に分割され、そこから個々の部分を得るために正規表現を使用することができました。ありがとう! – gooeylewie

関連する問題