繁体   English   中英

正则表达式嵌套值

[英]Regex for nested values

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

我的意思是例如:

/*asdasdasd /* asdasdsa */ qweqweqwe */

使第一个“ / *”与最后一个“ * /”匹配,而不是停止到第一个“ * /”

谢谢...

RegEx表达式自然很贪婪,因此您可以使用:

\/\*.*\*\/

如果您想让它做您担心的事情并使RegEx变得懒惰并在首场比赛后停止,则必须添加一个? 喜欢:

\/\*.*?\*\/

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

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

如果文本只有一个嵌套的注释,那么到目前为止提出的解决方案都可以。 但是,正如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]更改为[*\\/] )。

正则表达式不善于处理嵌套值,因为您所描述的不是“ 正则语言

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

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

我猜测您确实在寻找可以删除或处理字符串中正确嵌套的注释的东西,即使有不止一个-给出“贪婪”正则表达式的答案也会从第一个/*到最后一个*/ :在诸如keep /* comment */ keep /* comment */ keep类的字符串中,它们会将中间的keep视为注释的一部分。

简短的答案是Javascript RegExps不够强大,您需要递归模式。 (也就是regexp不能计数 )。

但是,如果只想删除注释,则可以使用循环并首先删除最里面的注释(使用@mVChr中的非贪婪RegExp,并对其进行修改以匹配最后一个可能的起始定界符而不是第一个)。

var re = /(.*)\/\*.*?\*\//; while (re.test(string)) string.replace(re, '$1')

可以这么说,这将(嵌套级别的)计数移出正则表达式并进入循环。 (我没有在正则表达式上放置g标志,因为我不确定在循环中的两个位置使用这样的正则表达式时会产生副作用。循环会照常查找所有出现的事件)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM