【问题标题】:How to strip single-line comments in obj-c properly如何正确去除 obj-c 中的单行注释
【发布时间】:2014-01-12 15:16:37
【问题描述】:

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

@"bsdv//sdfsdf"

我使用非捕获括号(?:(\"*\")*+),但没有成功。 我还为 Python 找到了这个表达式:

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

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

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

更新: 是的,这很难,我知道除了我所描述的之外,还有很多警告。如果有人发布只能解决我的问题的正则表达式,我将不胜感激。无论如何,我很快就会发布我的解决方案,没有正则表达式,我希望它对任何遇到此类问题的人都有帮助。

【问题讨论】:

  • 这很难做到。您需要考虑包含 // 的 C 字符串文字,虽然单行注释适用于换行符之前的行的剩余部分,但您前面的 @" 或 " 可能在上面的另一行上,随后的 " 也可能分别如果 C 行继续字符 \ 后跟换行符,则放在单独的行上。(有时由那些老派或讨厌必须向右滚动并且尚未发现 Xcode 会换行的人发现给你。Objective-C 具有 C 的所有规则。它是一个超集。
  • 您还需要处理一些古怪的事情,例如 ///* 和一般的多行 cmets。你可以看看 TextMate 在 Objective-C 包中为它的 Objective-C 语法做的一些花哨的东西,这些是很棒的正则表达式,但不是防弹的。学习使用 libclang 会更好。
  • 基本上,您不太可能单线完成。
  • 我只是不相信没有人在我之前成功
  • 很多尝试过,很多都接近了,但是如果没有某种形式的 AST(抽象语法树),在某些情况下它可能会失败。 TextMate 在其 Objective-C 语法(在 github 上)中有一些看似简单的正则表达式,但您会注意到,语言语法是正则表达式的集合,因为它们也构建了某种 AST。我并不是说不要尝试,但这并不比开发语法高亮引擎更容易。

标签: objective-c regex


【解决方案1】:

试试这个正则表达式:

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

演示

http://regex101.com/r/jT4xC8

说明

讨论

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

  • 案例 1: 单独一行,前面有或没有空白字符
  • 案例 2: Not Alone 在其前面的行中是否有空白字符和其他字符。

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

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

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

还有更多

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

【讨论】:

  • 有趣的方法。我稍后会检查它是否适用于真实的源代码。我看到它不支持这种情况#define SOME_CONSTANT 3.14 // pi我认为无论如何添加这个功能很容易
  • 还有一个案例self.viewController.title = @"sdfsdfs" //sdfsdfsdf \n "sdfsdf"; 但我真的很喜欢你的想法
  • 还有最有趣的NSString *myString = @"dsff; //fsdf";
  • @Ossir 我已经用您发布的新案例更新了我的答案。不要忘记查看演示。如果您发现新案例,请不要犹豫发布它们;)
  • 干得好!多行字符串的情况仍然没有覆盖=)对我来说它看起来像死路一条。但我认为这是我能得到的最好的答案,所以我会尽快将其标记为正确答案
猜你喜欢
  • 2011-11-15
  • 2012-02-11
  • 2010-10-13
  • 2019-04-27
  • 2011-02-14
  • 2011-07-22
  • 2016-02-02
  • 2012-02-09
  • 2010-11-08
相关资源
最近更新 更多