2017-05-10 8 views
0

/**/の間のテキストを一致させる必要があります。これらはJavaブロックコメントです。どのようにJava正規表現のコメントブロック間のテキストを一致させるには?

今のところ、トークンを閉じても終了しないため、意図したとおりに動作しないプログラムを作成しました。*/。ここでは、コードは次のとおりです。

public static void main(String[] args) { 
String s = "public void /* sdksd\n*k/sss\\d\nsd */ main class\n/*String s = null;*/trtgg"; 
     Matcher matcher = Pattern.compile("(?s)/\\*(.*)(?=\\*/)").matcher(s); 
     while (matcher.find()) { 
      String group = matcher.group(1); 
      System.out.println("group="+group); 
     } 
} 

それは印刷されます。

group= sdksd 
*k/sss\d 
sd */ main class 
/*String s = null; 

期待出力は次のようになります。

group= sdksd 
*k/sss\d 
sd 
group=String s = null; 

それが最初のトークン*/を閉じる時に停止しないのはなぜ?

これを達成する別の方法はありますか?

+4

'*' '貪欲であるので、あなたが使用する必要がある*'それは怠惰にします。。?。コメント抽出はかなり難しいかもしれませんが。 – anubhava

+0

[this solution](http://stackoverflow.com/a/36328890/3832970)を使用してください。マッチを完了するのに必要なステップは、Jiriが提案した最高のものより4倍以上です。 –

答えて

5

/* outer comment /* nested comment */ outer comment */のように、ネストされたコメントを許可しないとします。 (一部の正規表現はそれを持っていない)

/\\*.*?\\*/ 

または非貪欲マッチングを避けるために:

Javaでは、あなたは非欲張りマッチングを使用することができます

/\\*([^*]|\\*[^/])*\\*/ 

を使用すると、入れ子に許可した場合結果の言語は非正規であり、本当の正規表現では記述できません(厳密には規則的ではないため、Javaの正規表現でも可能です)。

0

実際に正規表現エンジンを(?=\\*/)と一致させるには、.*で1文字を消費した後に*を怠け者にする必要があります。ここ は正しいコードです:

Matcher matcher = Pattern.compile("(?s)/\\*(.*?)(?=\\*/)").matcher(s); 
関連する問題