正则表达式仅在子模式不匹配时匹配

时间:2009-03-25 12:34:34

标签: javascript regex

我正在尝试将C样式注释与文件匹配,但前提是注释不是以@引入的某些标签开头

例如来自

/* some comment to match */
/* another comment.
this should match also */
/*@special shouldn't match*/

这是否只能使用正则表达式?

我正在尝试使用正则表达式的JavaScript实现。

3 个答案:

答案 0 :(得分:4)

/\*\s*(?!@)(?:(?!\*/).)*\*/

分解为:

/\*               // "/*"
\s*               // optional space
(?!@)             // not followed by "@"
(?:               // don't capture...
   (?!\*/).       // ...anything that is not "*/"
)*                // but match it as often as possible
\*/               // "*/"

在“global”和“dotall”模式下使用(例如,点也应与新行匹配)

通常的警告词:与使用正则表达式执行的所有解析作业一样,这将在嵌套模式和输入损坏时失败。

emk points out a nice example(否则有效)输入将导致此表达式中断。这无法帮助,正则表达式不适用于解析。如果你肯定这样的事情在你的输入中永远不会发生,那么正则表达式可能仍适用于你。

答案 1 :(得分:1)

你可以从这样的事情开始:

/\*[^@]

但总的来说,你不会看到将C风格的评论与正则表达式相匹配,因为讨厌的角落情况。考虑:

"foo\" /* " " */ "

该代码中没有任何注释(它是两个字符串文字的编译时串联),但如果没有真正的解析器,你将无法解析它。 (从技术上讲,你可以使用正则表达式,因为你只需要一个简单的有限状态机。但这是一个非常恶心的正则表达式。)

答案 2 :(得分:0)

使用否定前瞻