正则表达式找到C评论

时间:2012-09-17 23:39:08

标签: ruby regex parsing

我需要Ruby中的regexp才能在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
 */

有什么想法吗?获得预期输出的正确正则表达式是什么?

1 个答案:

答案 0 :(得分:2)

尝试将.*添加到正则表达式的开头。

目前,正则表达式.*?之后的rb_define_class_under会让您始终匹配并捕获字符串的第一部分,并且.*?会匹配,直到您实际上是类名寻找。

通过在正则表达式的开头添加一个贪婪的匹配,您确保只在所需的类名之前的最后/*处启动捕获组。

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

请注意,您仍然从字符串的开头匹配,但第一个捕获组是正确的注释。