如何正确删除obj-c中的单行注释

时间:2014-01-12 15:16:37

标签: objective-c regex

我知道有很多资源都有正则表达式。但我找不到我想要的那个。 我的问题是: 我想从obj-c源中删除一行注释(//),但我不想破坏其中的代码。例如,使用此正则表达式:@"//.*"我可以删除所有注释,但它也会破坏字符串文字:

@"bsdv//sdfsdf"

我使用非捕获括号(?:(\"*\")*+),但没有成功。 我也发现了Python的这个表达式:

r'(\".*?\"|\'.*?\')|(/\*.*?\*/|//[^\r\n]*$)'

它应该涵盖我的情况,但我还没弄清楚如何使它与obj-c一起使用。

请帮我构建正确的正则表达式。

更新:是的,这是一个艰难的,我知道有很多警告,除了我描述的那个。如果有人发布只能修复我的问题的正则表达式,我将不胜感激。无论如何,我会尽快发布我的解决方案,没有正则表达式,我希望它对那些努力解决这个问题的人也会有所帮助。

1 个答案:

答案 0 :(得分:2)

试试这个正则表达式:

(?:^|.*;(?!.*")|#(?:define|endif|ifn?def|import|undef|...).*)\s*(//[^\r\n]+$)

<强>演示

http://regex101.com/r/jT4xC8

<强>描述

Regular expression visualization

<强>讨论

除了评论中表达的所有警告外,我假设在两个不同的情况下可以出现一行:

  • 案例1:单独使用空白字符或不使用空白字符
  • 案例2:在其前面的行上没有单独或不是空白字符和其他字符。

在第一种情况下,我们匹配行的开头(^/m标志)。然后我们搜索零个或多个空白字符(\s*),最后搜索单行注释://[$\r\n]+$

在第二种情况下,如果该行上还有其他字符,则它们形成语句。任何语句都以分号;结束。所以我们搜索最后一个语句及其相应的分号.*;(?!.*")。然后我们搜索单行评论。那些其他字符也可以是预处理器语句。在这种情况下,它们由尖锐的#引入。

一个重要的关键点是我假设传递给正则表达式的代码是 编译 的代码。

还有更多

不要忘记添加一些可能适用于您的情况的其他预处理器指令。检查这个答案:https://stackoverflow.com/a/18014883/363573