2013-04-23 37 views
9

regexを使ってこのパターンを見つけるには?Cスタイルのブロックコメントを見つけるための正規表現

Cスタイルのブロックコメント

/* xxxxxxxxxxxx */

+0

'/ *'が同じ行にあり、 '//'の後にあると、コメントを開始しません。 – Patashu

+0

いいえ、私はそのような状況に対処する必要はありません – linquize

+0

正規表現のほかに、すべてを出そうと思えば、C(または何でも)の言語文法で言語パーサーを使うことができます。例はyacc、javacc、antlrです。 –

答えて

1

私は非常にちょうどコメントのように、パーサを使用することをお勧めしますが、ちょうど楽しみのためならば - 私の頭の上から、あなたはルビーを使用して、このような何かを行うことができ、あなたはすでに(これは非常に荒く、ちょうど可能なガイドです念頭に置いておく - prolly箱から出して動作しません)ファイルからコンテンツを取得する方法を知っていると仮定すると:

def one_liner_comment string 
    string.match /\/\*.*\*\// 
end 

def multi_liner_comment_start string 
    # if always checking for one_liner_comment in code would not need first !one_... 
    !one_liner_comment(string) && string.match(/\/\*/) 
end 

def multi_liner_comment_end string 
# if always checking for one_liner_comment in code would not need first !one_... 
!one_liner_comment(string) && string.match(/\*\//) 
end 

次に、あなただけのどこかを決定するために

if one_liner(string) 
    inline = true 
elsif multi_liner_comment_start(string) 
    started = true 
elsif started && multi_liner_comment_end(string) 
    ended = true 
end 

ここからあなたのコメントで何でもしてください。

if inline 
    # do whatever you want 
    one_liner = false 
elsif started && !ended 
    # do whatever you want -> append or create new string 
elsif started && ended 
    # do whatever you want -> append to string 
    started = false 
    ended = false 
end 

、それはまた、クリーンアップすることができ確かに...

20

は一行と複数行のブロックコメントをキャプチャする

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

を使用してみてください。これは、どちらかのいずれかの数字が続く/*を検索:

  • /
  • 任意の文字が続かない**

を除いた後、クロージング*/再び。

+0

別のブランチの空白文字を一致させる必要はありません。 '[^ * /]'はそれらをカバーしています。すべての '| \ s'はあなたを[破滅的なバックトラッキング](http://www.regular-expressions.info/catastrophic.html)まで開きます。また、そこからスラッシュを取得する必要があります、またはあなたの正規表現は、スラッシュ内のコメントに一致することができません。 –

+0

あなたの提案に変更されました(OPによると、スラッシュによるコメントは問題ではないようです) – Campfire

+0

なぜ/ /**(.(?!\*/))*\*/ 'なのですか?最初に '/ *'をつけた後に '* /'と '* /'を続けて入力しないでください。 – zzh1996

関連する問題