1

我需要一个 Ruby 中的正则表达式来查找 C 指令之前的注释。

例如我有这个文件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);

然后我在 ruby​​ 中有我的解析器,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 回答