使用 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]+) —捕获大写单词

.&lt;space&gt; — 查找大写字母和数字之间的空格

(\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 文件的特定部分

如何以编程方式处理英文缩写 [Regex, JS, Ruby]

以特定方式转换为宽格式

修复 RegEx 以正确捕获括号内的文本

Ruby Regex 从电子邮件地址中提取域

PHP Regex 在字符串中插入特定字符串以打印 code128 条形码