Regexp to find C comments

2019-09-29 11:27发布

我需要在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
 */

任何想法? 什么是正确的正则表达式来获得预期的输出?

Answer 1:

尝试添加.*的正则表达式的开始。

目前.*?rb_define_class_under在你的正则表达式是导致你总是匹配并捕获字符串的第一部分,和.*? 比赛直到你实际上是在寻找类名。

通过在正则表达式的开头添加一个贪婪的比赛,你要确保你只在最后一个启动捕获组/*上课之前你想要的名字。

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

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



文章来源: Regexp to find C comments