English 中文(简体)
如果子模式没有匹配,正则表达式才匹配。
原标题:
  • 时间:2009-03-25 12:34:34
  •  标签:

我正在尝试从文件中匹配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" /* " " */ "

那个代码中没有注释(它是两个字符串字面量的编译时连接),但如果没有真正的解析器,你不会有太多的运气分析它。(从技术上讲,你可以使用正则表达式,因为你只需要一个简单的有限状态机。但它是一个非常恶心的正则表达式。)

使用负向先行断言





相关问题
热门标签