【发布时间】: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 正则表达式中无效。
【问题讨论】: