我需要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
*/
有什么想法吗?获得预期输出的正确正则表达式是什么?
答案 0 :(得分:2)
尝试将.*
添加到正则表达式的开头。
目前,正则表达式.*?
之后的rb_define_class_under
会让您始终匹配并捕获字符串的第一部分,并且.*?
会匹配,直到您实际上是类名寻找。
通过在正则表达式的开头添加一个贪婪的匹配,您确保只在所需的类名之前的最后/*
处启动捕获组。
示例:http://www.rubular.com/r/Orja089zAI
请注意,您仍然从字符串的开头匹配,但第一个捕获组是正确的注释。