我正在尝试从文件中匹配C风格的注释,但仅当注释不以由@
引入的特定标签开头时才匹配。
举个例子,从。。。
/* some comment to match */
/* another comment.
this should match also */
/*@special shouldn t match*/
这是否仅使用正则表达式就可以实现?
我正在尝试使用JavaScript正则表达式的实现。
我正在尝试从文件中匹配C风格的注释,但仅当注释不以由@
引入的特定标签开头时才匹配。
举个例子,从。。。
/* some comment to match */
/* another comment.
this should match also */
/*@special shouldn t match*/
这是否仅使用正则表达式就可以实现?
我正在尝试使用JavaScript正则表达式的实现。
/*s*(?!@)(?:(?!*/).)**/
分解为:
/* // "/*" s* // optional space (?!@) // not followed by "@" (?: // don t capture... (?!*/). // ...anything that is not "*/" )* // but match it as often as possible */ // "*/"
在“全局”和“点对点”模式中使用(例如,点应匹配换行符)。
常见的警告:像所有使用正则表达式执行解析作业一样,这将在嵌套模式和破损输入方面失败。
emk指出了一个很好的例子,即使是有效的输入,也会导致该表达式出错。这是无法避免的,正则表达式不适用于解析。如果您确定这样的事情永远不会发生在您的输入中,那么正则表达式仍然可能适用于您。
你可以从类似这样的东西开始:
/*[^@]
但是一般来说,您不应该使用正则表达式来匹配 C-style 注释,因为存在一些棘手的情况。请考虑:
"foo" /* " " */ "
那个代码中没有注释(它是两个字符串字面量的编译时连接),但如果没有真正的解析器,你不会有太多的运气分析它。(从技术上讲,你可以使用正则表达式,因为你只需要一个简单的有限状态机。但它是一个非常恶心的正则表达式。)
使用负向先行断言