我知道有很多资源都有正则表达式。但我找不到我想要的那个。
我的问题是:
我想从obj-c源中删除一行注释(//
),但我不想破坏其中的代码。例如,使用此正则表达式:@"//.*"
我可以删除所有注释,但它也会破坏字符串文字:
@"bsdv//sdfsdf"
我使用非捕获括号(?:(\"*\")*+)
,但没有成功。
我也发现了Python的这个表达式:
r'(\".*?\"|\'.*?\')|(/\*.*?\*/|//[^\r\n]*$)'
它应该涵盖我的情况,但我还没弄清楚如何使它与obj-c一起使用。
请帮我构建正确的正则表达式。
更新:是的,这是一个艰难的,我知道有很多警告,除了我描述的那个。如果有人发布只能修复我的问题的正则表达式,我将不胜感激。无论如何,我会尽快发布我的解决方案,没有正则表达式,我希望它对那些努力解决这个问题的人也会有所帮助。
答案 0 :(得分:2)
试试这个正则表达式:
(?:^|.*;(?!.*")|#(?:define|endif|ifn?def|import|undef|...).*)\s*(//[^\r\n]+$)
<强>演示强>
<强>描述强>
<强>讨论强>
除了评论中表达的所有警告外,我假设在两个不同的情况下可以出现一行:
在第一种情况下,我们匹配行的开头(^
和/m
标志)。然后我们搜索零个或多个空白字符(\s*
),最后搜索单行注释://[$\r\n]+$
。
在第二种情况下,如果该行上还有其他字符,则它们形成语句。任何语句都以分号;
结束。所以我们搜索最后一个语句及其相应的分号.*;(?!.*")
。然后我们搜索单行评论。那些其他字符也可以是预处理器语句。在这种情况下,它们由尖锐的#
引入。
一个重要的关键点是我假设传递给正则表达式的代码是 编译 的代码。
不要忘记添加一些可能适用于您的情况的其他预处理器指令。检查这个答案:https://stackoverflow.com/a/18014883/363573