1

C命令の前にコメントを見つけるには、Rubyの正規表現が必要です。

たとえば、私はこのファイルを持っていますexample.c

/*
 * COMMENT NUMBER 1
 */
x = rb_define_class_under (foo, "MyClassName1", bar);

/*
 * COMMENT NUMBER 2
 */
y = rb_define_class_under (foo, "MyClassName2", bar);

/*
 * COMMENT NUMBER 3
 */
z = rb_define_class_under (foo, "MyClassName3", bar);

次に、パーサーを次のようにルビーに入れparser.rbます。

content = File.open('example.c').read

if content =~ /((?>\/\*.*?\*\/))([\w\.\s]+\s=\s)?rb_define_class_under.*?"(MyClassName1)"/m
  puts "Comment number 1 is:"
  puts $1
end

if content =~ /((?>\/\*.*?\*\/))([\w\.\s]+\s=\s)?rb_define_class_under.*?"(MyClassName2)"/m
  puts "Comment number 2 is:"
  puts $1
end

if content =~ /((?>\/\*.*?\*\/))([\w\.\s]+\s=\s)?rb_define_class_under.*?"(MyClassName3)"/m
  puts "Comment number 3 is:"
  puts $1
end

今私が期待する出力はこれです:

Comment number 1 is:
/*
 * COMMENT NUMBER 1
 */
Comment number 2 is:
/*
 * COMMENT NUMBER 2
 */
Comment number 3 is:
/*
 * COMMENT NUMBER 3
 */

しかし、私は得ます:

Comment number 1 is:
/*
 * COMMENT NUMBER 1
 */
Comment number 2 is:
/*
 * COMMENT NUMBER 1
 */
Comment number 3 is:
/*
 * COMMENT NUMBER 1
 */

何か案が?期待される出力を得るための正しい正規表現は何ですか?

4

1 に答える 1

2

.*正規表現の先頭に追加してみてください。

現在、正規表現の.*?afterrb_define_class_underにより、文字列の最初の部分が常に一致してキャプチャ.*?され、実際に探しているクラス名まで一致します。

正規表現の先頭に貪欲な一致を追加することにより、目的/*のクラス名の前の最後でのみキャプチャグループを開始するようにします。

例:http ://www.rubular.com/r/Orja089zAI

文字列の先頭から一致しますが、最初のキャプチャグループが正しいコメントであることに注意してください。

于 2012-09-17T23:52:57.630 に答える