Javascript 提取评论 RegExp

Posted

技术标签:

【中文标题】Javascript 提取评论 RegExp【英文标题】:Javascript Extract Comments RegExp 【发布时间】:2012-04-23 07:59:32 【问题描述】:

我有一个这样的 javascript 文件

/**
 * My Comment Line1
 * My Comment Line2
 */
var a = 123;
/**
 * My Comment Line3
 * My Comment Line4
 */
var b = 456;

我正在使用node.js读取文件,并想在这个文件中提取cmets。

我使用这个正则表达式

/\/\*\*((?:\r|\n|.)*)\*\//

但是这会提取

/**
 * My Comment Line1
 * My Comment Line2
 */
var a = 123;
/**
 * My Comment Line3
 * My Comment Line4
 */

我的程序有一个循环来逐个提取匹配的块。所以我想要一个正则表达式来提取

第一个循环

/**
 * My Comment Line1
 * My Comment Line2
 */

第二个循环

/**
 * My Comment Line3
 * My Comment Line4
 */

规则就是注释块以/** 开头,以*/ 结尾。在评论中,所有字符都是允许的。

谁能帮帮我?谢谢!

【问题讨论】:

【参考方案1】:

试试这个:(任何类型的 cmets 都可以)- 现场演示:http://regexr.com?30jrh

(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)

看看:

【讨论】:

我也喜欢这个答案!这是一个更通用的答案。谢谢! @AlexYeung 不客气,我的朋友! :-) 这是我用于多行注释匹配的最成熟的正则表达式之一。它捕获了许多“隐藏”的情况(例如评论中的*/,这仍然是评论,对吧?)+它还获得单行cmets(//)。 var s = "This is a /*string*/" 怎么样?你的正则表达式会得到一个误报。我认为如果不实际解析大部分脚本,就不可能正确覆盖所有边缘情况。 谢谢!这也是我发现的! 对于任何因语法错误而苦苦挣扎的人var commentPattern = new RegExp('(\\/\\*([^*]|[\\r\\n]|(\\*+([^*\/]|[\\r\\n])))*\\*+\/)|(\/\/.*)', 'g');【参考方案2】:

这是一个正则表达式:

/\/\*\*(.|\n)+?\*\//

And here's a demo.

【讨论】:

@Dr.Kameleon:请检查更新,包括演示。 (你现在可以取消你的反对票了......) @Dr.Kameleon:我真的不在乎“RegExr”怎么说,这是 JavaScript 和 jsFiddle,你知道,证明它确实有效。尽管如此,启用“dotall”和“global”标志让它在那里工作。 有效!但为什么?关键是?。我不明白... :( @AlexYeung:量词后的? 使其不贪婪,即它会尝试匹配尽可能少的字符。【参考方案3】:

其他答案对我来说不太适用。下面是在 Node.js 中解析 Javascript 的方法。

/(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)|(\/\/.*)/g

【讨论】:

【参考方案4】:
/(\/\*).*?(\*\/)|(\/\/).*?(\n|\$)/s

匹配开始和结束多行标签以及介于两者之间的任何内容

(\/\*).*?(\*\/)

或者匹配一个以换行符或行尾结束的单行打开注释

(\/\/).*?(\n|\$)

【讨论】:

单行匹配落在带有诸如“httm://www....”之类的 URL 的行上@Mwayi。您有解决方案来阻止这种请求吗?

以上是关于Javascript 提取评论 RegExp的主要内容,如果未能解决你的问题,请参考以下文章

即使未达到评论数量,如何告诉 Python 继续提取?

如何提取亚马逊评论?

从 Google Places API 获得超过 5 条评论

从新闻网站中提取用户评论

SQL 嵌套查询和使用 MAX 提取最近的事务和/或评论

BeautifulSoup 从评论 html 中提取文本 [重复]