正则表达式嵌套值

时间:2011-03-18 21:32:40

标签: javascript regex comments nested

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

我的意思就是这个例子:

/*asdasdasd /* asdasdsa */ qweqweqwe */

将第一个“/ *”与最后一个“* /”匹配,而不是停在第一个“* /”

...谢谢

5 个答案:

答案 0 :(得分:3)

正则表达式无法按定义计算嵌套项(尽管实现的确比计算机科学定义更进一步)。

请参阅http://en.wikipedia.org/wiki/Regular_expression#Expressive_power_and_compactness

答案 1 :(得分:2)

RegEx表达式自然会贪婪,所以你可以使用:

\/\*.*\*\/

如果你想让它做你害怕的事情并使RegEx变得懒惰并在第一场比赛后停止,你必须添加?之类的:

\/\*.*?\*\/

答案 2 :(得分:1)

如果文本只有一个嵌套注释,到目前为止提供的解决方案可以正常工作。但是,正如LHMathies所指出的那样,如果文本中有多条评论包含您想要保留的内容,那么这些解决方案就会失败。例如,以下是一些测试数据,用于验证算法是否正常工作:

/* one */
Stuff one
/* two /* three */ two */
Stuff two
/* four */

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

function strip_nested_C_comments(text)
{ // Regex to match innermost "C" style comment.
    var re = /\/\*[^*\/]*(?:(?!\/\*|\*\/)[*\/][^*\/]*)*\*\//i;
    // Iterate stripping comments from inside out.
    while (text.search(re) != -1) {
        text = text.replace(re, '');
    }
    return text;
}

修改:改善非匹配案例的正则表达式效率。 (即将“特殊”从[\S\s]更改为[*\/])。

答案 3 :(得分:0)

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

但正则表达式自然是贪婪的。这意味着*和+量词默认情况下它们将完全按照您的要求进行

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

答案 4 :(得分:0)

我猜你真的想要从字符串中删除或处理正确的嵌套注释,即使有不止一个 - 给出'贪婪'正则表达式的答案将来自第一个{{1} }到最后/*:在*/之类的字符串中,他们会将中间keep /* comment */ keep /* comment */ keep视为评论的一部分。

简短的回答是Javascript RegExps不够强大,你需要递归模式。 (也称为 regexp不能计算)。

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

keep

这样可以将计数(嵌套级别)从正则表达式中移出并循环到循环中。 (我没有在正则表达式上放置var re = /(.*)\/\*.*?\*\//; while (re.test(string)) string.replace(re, '$1') 标志,因为我不确定在循环中的两个位置使用这样的正则表达式时的副作用。并且循环负责找到所有出现的事情。)< / p>