【问题标题】:Regexp to find C comments正则表达式查找 C 注释
【发布时间】:2012-09-17 23:39:08
【问题描述】:

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

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

【问题讨论】:

    标签: ruby regex parsing


    【解决方案1】:

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

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

    通过在正则表达式的开头添加一个贪婪匹配,您可以确保您只在您想要的类名之前的最后一个/* 开始您的捕获组。

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

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

    【讨论】:

      猜你喜欢
      • 2014-01-27
      • 2013-04-16
      • 2011-07-19
      • 1970-01-01
      • 2014-10-15
      • 2011-10-28
      • 2014-07-26
      • 1970-01-01
      • 2013-10-19
      相关资源
      最近更新 更多