使用 Ruby Regex 以特定格式为每个文件查找多个 Objective-C 注释
Posted
技术标签:
【中文标题】使用 Ruby Regex 以特定格式为每个文件查找多个 Objective-C 注释【英文标题】:Find multiple Objective-C comments per file, in certain format, with Ruby Regex 【发布时间】:2012-02-15 07:39:33 【问题描述】:我正在编写一个 Ruby 脚本,它使用正则表达式在 Objective-C 源代码文件中查找特定格式的所有 cmets。
格式是
/* <Headline_in_caps> <#>:
<Comment body>
**/
我想捕捉大写的标题、评论的数量和正文。
使用下面的正则表达式,我可以在更大的正文中找到这种格式的评论。
我的问题是,如果文件中有多个 cmets,那么我最终会得到第一个 /*
和最后一个 **/
之间的所有文本,包括代码。 我不希望它包含所有文本,而只捕获每个 /*
和 **/
中的内容。
评论正文可以包含所有字符,**/
和 */
除外,它们都表示评论的结束。假设正则表达式会发现多个整体正则表达式匹配只处理一次文本,我是否正确?
\/\*\s*([A-Z]+). (\d)\:([\w\d\D\W]+)\*2\//x
拆分正则表达式是这样的:
\/\*
— 找到评论的开头
\s*
— 查找空格
([A-Z]+)
—捕获大写单词
.<space>
— 查找大写字母和数字之间的空格
(\d)
—捕获数字
\:
— 找到冒号
([\w\W\d\D]+)
— 捕获可以包含所有有效字符的消息正文,**/
或 */
除外
\*2\/
— 找到评论的结尾
这是一个示例,从第一个 /*
到第二个 **/
的所有内容都被捕获。:
/*
HEADLINE 1:
Comment body.
**/
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
// This text and method declaration are captured
// The regex captures from HEADLINE to the end of the comment "meddled in." inclusively.
/*
HEADLINE 2:
Should be captured separately and without Objective-C code meddled in.
**/
这是 Rubular 上的示例:http://rubular.com/r/4EoXXotzX0
我正在使用gsub
处理整个文件字符串上的正则表达式,运行 Ruby 1.9.3。我遇到的另一个问题是 gsub 给了我 Rubular 忽略的东西,这是回归还是 Rubular 使用了不同的方法来提供我想要的东西?
在这个关于多次出现的问题Regex matching multiple occurrences per file and per line 中,答案是使用 g 作为全局选项,这在 Ruby 正则表达式中无效。
【问题讨论】:
【参考方案1】:更改此:([\w\W\d\D]+)
对此:([\w\W\d\D]+?)
这将导致正则表达式是非贪婪的,一旦看到下一个关闭 **/
就会停止。 (更新的规则:http://rubular.com/r/Whm31AJ6Kg)
另外,请注意[\w\W\d\D]
绝对匹配任何字符,并且可以更简单地写为[\w\W]
。您也可以将正文与[^*\/]
匹配,这也将避免上述通过关闭匹配的问题。 (更新了rubular:http://rubular.com/r/2h0kGYkdVQ)
【讨论】:
太棒了!不贪婪是我想要的。谢谢。【参考方案2】:解决方案:
用'*/'
分割整个字符串(评论结束)
如果拆分只返回一个元素,则String中没有注释
否则,对于除最后一个之外的每个标记,使用 RegExp %r/\*(.*)$
(从 '/*' 开始直到标记结束) 捕获整个评论内容(您可以在这里使用更复杂的 RegExp 来捕获评论中的更多数据)
它可能不是最漂亮的解决方案,但它应该可以完成工作。而且它不是万无一失的,如果您的 Objective-C 源代码中有类似下面一行的内容,我的解决方案将失败。
char *myString = "a comment /* */";
【讨论】:
以上是关于使用 Ruby Regex 以特定格式为每个文件查找多个 Objective-C 注释的主要内容,如果未能解决你的问题,请参考以下文章
使用 c++/boost::regex 提取 HTML 文件的特定部分