Javascript 用于嵌套值的正则表达式

Javascript 用于嵌套值的正则表达式,javascript,regex,comments,nested,Javascript,Regex,Comments,Nested,我想要一个可以忽略嵌套匹配进行解析的正则表达式 例如,我的意思是: /*asdasdasd /* asdasdsa */ qweqweqwe */ 将第一个“/*”与最后一个“*/”匹配,并且不停止与第一个“*/”匹配 谢谢…正则表达式自然会贪婪,所以您可以使用: \/\*.*\*\/ 如果你想让它做你害怕的事情,让正则表达式变得懒惰,并在第一次匹配后停止,你必须添加一个?,比如: \/\*.*?\*\/ 正则表达式不擅长处理嵌套值,因为您所描述的不是 但是正则表达式天生就是贪婪的。这意味

我想要一个可以忽略嵌套匹配进行解析的正则表达式

例如,我的意思是:

/*asdasdasd /* asdasdsa */ qweqweqwe */
将第一个“/*”与最后一个“*/”匹配,并且不停止与第一个“*/”匹配


谢谢…

正则表达式自然会贪婪,所以您可以使用:

\/\*.*\*\/
如果你想让它做你害怕的事情,让正则表达式变得懒惰,并在第一次匹配后停止,你必须添加一个
,比如:

\/\*.*?\*\/

正则表达式不擅长处理嵌套值,因为您所描述的不是

但是正则表达式天生就是贪婪的。这意味着*和+量词在默认情况下会完全满足您的要求

var data = "/*asdasdasd /* asdasdsa */ qweqweqwe */";
data = data.replace( /\/\*.*\*\//, '' );
alert( 'Data: ' + data );

正则表达式不能按定义计算嵌套项(尽管实现比计算机科学定义更深入)


请参见

我猜您真正想要的是从字符串中删除或正确处理嵌套注释的内容,即使有不止一个——给出“贪婪”正则表达式的答案将从第一个
/*
到最后一个
*/
:在
keep/*comment*/keep/*comment*/keep
等字符串中,它们将中间的
keep
作为注释的一部分

简单的回答是Javascript正则表达式的功能不够强大,因此需要递归模式。(也称为regexps不能计数)

但是,如果您只想删除注释,可以使用循环并首先删除最里面的注释(使用@mVChr中的非贪婪RegExp,修改为匹配最后一个可能的起始分隔符,而不是第一个分隔符):


可以这么说,这将计数(嵌套级别)移出regexp并进入循环。(我没有在regexp上加上
g
标志,因为我不确定在循环中的两个地方使用这样的regexp时会有什么副作用。循环会负责查找所有出现的情况)。

如果文本只有一个嵌套注释,那么到目前为止给出的解决方案是可行的。然而,正如LHMathies所指出的,如果文本中有多条注释,其中包含您想要保留的内容,那么这些解决方案将失败。例如,以下是一些验证算法是否正确工作的测试数据:

/*one*/

Stuff one

/*two/*three*/two*/

填充两个

/*four*/

正确的解决方案将保留两行中的内容。要在Javascript中正确处理这种情况,您需要一个与最里面的注释匹配的正则表达式(这是最难的部分),然后重复应用它,直到所有注释都消失。下面是一个经过测试的函数,它可以精确地执行以下操作:

功能条嵌套注释(文本)
{//Regex匹配最里面的“C”样式注释。
变量re=/\/\*[^*\/]*(?:(?!\/\*\*\*\*/)[*\/][^*\/]*)*\*\//i;
//从内到外迭代剥离注释。
while(text.search(re)!=-1){
text=text.replace(re.);
}
返回文本;
}

编辑:提高了不匹配情况下的正则表达式效率。(即,将“特殊”从
[\S\S]
更改为
[*\/]
)。

当它们在带引号的字符串中时也是如此?也就是说,这为混合添加了一个全新的成分。你不能用纯正则表达式解析无限嵌套。@当我尝试匹配*/时,我得到第一个,但我想要最后一个。
“/*asdasdasd/*asdasdsa*/qweqweqwe*/”。替换(/\/\*.*\/,“t”)
t
@Radek S替换整个字符串:我不喜欢带引号的字符串。它将有纯文本内!但是有了点(.),我只得到一行,正确地想!如果我有多行,[\w\w]*正确吗?或者有更好的解决方案吗?如果有多个注释,其中包含您想要保留的内容,则该解决方案不起作用。您的想法是正确的,但不幸的是,您的正则表达式与“最里面的”注释不完全匹配。看我的答案,一个正则表达式将(事实证明这并不是那么简单!)@ridgerunner:你说得很对,
\/\*.*?\*\/
将匹配外部的
/*
,而不是内部的。不过,如果添加多行标志,它非常适合匹配C89注释。我正在修正答案,使
/*
尽可能晚地匹配,然后它甚至可以与贪婪匹配一起工作,仍然在分隔符之间使用一个简单的
*
。不完全是这样,仍然需要非贪婪匹配。正如我所说,匹配“最里面”注释的正则表达式是非常重要的。请参阅我的答案,以了解是否正确工作。它还实现了Friedl的“展开循环”构造以提高速度。@ridgerunner:您有没有一个具体的例子,说明我的regexp(未捕获的部分)与最右边的最里面的注释不匹配?(忽略多行问题)。如果有多个注释,且其中包含您希望保留的内容,则不起作用。是的,表达式确实不能匹配嵌套结构,但Perl、PHP和.NET正则表达式确实可以。我基本上知道正则表达式比“正则表达式”更强大,但我当然不知道有些实现处理嵌套。这很有趣:)而且,在我看来,ridgerunner的答案是最正确的。
var re = /(.*)\/\*.*?\*\//; while (re.test(string)) string.replace(re, '$1')