【发布时间】: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