2013-04-23 58 views
9

如何使用正则表达式找到这个模式?正则表达式来查找C风格块评论

空调风格的块注释

/* xxxxxxxxxxxx */

+0

如果'/ *'在同一行和'//'后面,这意味着它不会开始评论? – Patashu 2013-04-23 03:04:46

+0

不,我不需要处理这种情况 – linquize 2013-04-23 03:07:15

+0

除了使用正则表达式,如果你想全力以赴,你可以使用语言解析器和C(或其他)语言语法。例子是yacc,javacc,antlr – 2013-04-23 03:41:15

回答

1

我强烈建议只使用一个解析器一样的意见,但如果只是为了好玩 - 从我的头顶,你可以使用Ruby做这样的事情,假设你已经知道如何从文件中获取内容(请记住,这是非常粗糙,只是一个可能的指南 - prolly将无法工作开箱):

def one_liner_comment string 
    string.match /\/\*.*\*\// 
end 

def multi_liner_comment_start string 
    # if always checking for one_liner_comment in code would not need first !one_... 
    !one_liner_comment(string) && string.match(/\/\*/) 
end 

def multi_liner_comment_end string 
# if always checking for one_liner_comment in code would not need first !one_... 
!one_liner_comment(string) && string.match(/\*\//) 
end 

然后确定你只是在那里

if one_liner(string) 
    inline = true 
elsif multi_liner_comment_start(string) 
    started = true 
elsif started && multi_liner_comment_end(string) 
    ended = true 
end 

然后执行任何你想做的事情,从你的意见从这里开始。

if inline 
    # do whatever you want 
    one_liner = false 
elsif started && !ended 
    # do whatever you want -> append or create new string 
elsif started && ended 
    # do whatever you want -> append to string 
    started = false 
    ended = false 
end 

当然它也可以被清理......

20

尝试使用

\/\*(\*(?!\/)|[^*])*\*\/ 

捕捉单行和多行块注释。它搜索/*后跟任意数量的任一:

  • 一个*未后跟一个/
  • 任何炭除了*

然后闭合*/一次。

+0

您不需要在单独的分支中匹配空白字符; '[^ * /]'将它们覆盖。所有的'| \ s'确实会打开你[灾难性的回溯](http://www.regular-expressions.info/catastrophic.html)。此外,你需要从那里得到那个斜线,否则你的正则表达式将无法将注释与斜线内部的斜线相匹配。 – 2013-04-23 11:13:16

+0

更改为您的建议(尽管OP表示,斜杠的评论似乎不成问题) – Campfire 2013-04-23 14:14:53

+0

为什么不能'/\*(.(?!\*/*/))**\*/'?首先是一个'/ *',然后是任何不是'* /'后面的字符,然后''/'' – zzh1996 2017-01-23 08:49:39